Monad
可以将 Just [1,2]
传递给 ,它与原始
。length
函数采用的类型不同>>>= 返回。长度
Just [1,2] >>= return . length
我可以说 Monad
可以使用 将
? (当然它们并不是真正的同构。)Maybe [a]
视为与 [a]
在长度上同构吗(>>=, 返回)
我可以选择术语“同构”这种情况吗?
最佳答案
你的例子最终说明的是 Maybe
是一个仿函数:如果你有一些 f::a -> b
,你可以使用 fmap
把它变成 fmap f::Maybe a -> Maybe b
in a way that preserves identities and composition . Monad 是仿函数,具有 \f m -> m >>= return 。 f
与 fmap f m
相同。在你的例子中,我们有 length
函数被 Maybe
仿函数转换。
can I choose term "isomorphic" this situation?
不是真的。 Maybe
的 fmap
不是同构。同构需要有一个双向逆来取消它,在这种情况下是这样的:
unFmapMaybe :: (Maybe a -> Maybe b) -> (a -> b)
-- For it to be a two-sided inverse to `fmap`, we should have:
unFmapMaybe . fmap = id
fmap . unFmapMaybe = id
但是,没有 (Maybe a -> Maybe b) -> (a -> b)
函数,因为无法获得 b
结果如果输入 Maybe a -> Maybe b
函数给出了 Nothing
。虽然有一些特定的仿函数,其 fmap
是同构的(Identity
是一个例子),但通常情况并非如此。
https://stackoverflow.com/questions/71456947/