如何写这样的函数?
unWrap :: F f a -> Either a (f (F f a))
其中 F - Church 编码的自由 monad.unWrap 如果值等于 "Pure a",则返回 "a",如果值等于 "(Free f_(",则返回 "f_"。
您可以使用fromF
转换为另一种表示形式,在本例中Free f
,以便进行模式匹配,toF
从Free f
转换回来。
unwrap :: Functor f => F f a -> Either a (f (F f a))
unwrap u = case fromF u of
Pure x -> Left x
Free v -> Right (fmap toF v)