我可以说 Monad 使将某些类型视为同构成为可能吗?
Can I say that Monad makes it possible to see some types as isomorphic?
Monad
可以将 Just [1,2]
与原始 length
函数采用的类型不同,传递给 >>= return . length
.
Just [1,2] >>= return . length
我可以说 Monad
可以使用 (>>=, return)
将 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?
不是真的。 fmap
对于 Maybe
不是同构。同构需要有一个 two-sided 逆来取消它,在这种情况下是这样的:
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)
函数,因为如果输入 Maybe a -> Maybe b
函数给出 Nothing
,则无法获得 b
结果。虽然有一些特定的函子 fmap
是同构的(Identity
是一个例子),但通常情况并非如此。
[a]
同构于 quotient type of Maybe [a]
with Nothing
and Just []
considered equivalent. Alternatively it is isomorphic to Maybe (<a href="https://hackage.haskell.org/package/base-4.16.0.0/docs/Data-List-NonEmpty.html#t:NonEmpty" rel="noreferrer">NonEmpty</a> a)
,它简单地消除了 Just []
的情况。
换句话说,[a]
可以分解为 Maybe
和 NonEmpty
函子的组合。
这样做的结果是您可以将 NonEmpty a
上的任何函数提升为 [a]
上的函数:
liftEmptyable :: (NonEmpty a -> r) -> [a] -> Maybe r
liftEmptyable _ [] = Nothing
liftEmptyable f (x:xs) = Just $ f (x:|xs)
虽然不确定这实际上与您的问题有多大关系。正如 duplode 回答的那样,除了简单的仿函数映射之外,您实际上什么都不做。我们最多可以详细说明 monad 法则确保 fmap
确实表现得好像 length
直接作用于包含的列表:
Just [1,2] >>= return . length
≡ return [1,2] >>= return . length -- def. of `Monad Maybe`
≡ return (length [1,2]) -- left-identity monad law
Monad
可以将 Just [1,2]
与原始 length
函数采用的类型不同,传递给 >>= return . length
.
Just [1,2] >>= return . length
我可以说 Monad
可以使用 (>>=, return)
将 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?
不是真的。 fmap
对于 Maybe
不是同构。同构需要有一个 two-sided 逆来取消它,在这种情况下是这样的:
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)
函数,因为如果输入 Maybe a -> Maybe b
函数给出 Nothing
,则无法获得 b
结果。虽然有一些特定的函子 fmap
是同构的(Identity
是一个例子),但通常情况并非如此。
[a]
同构于 quotient type of Maybe [a]
with Nothing
and Just []
considered equivalent. Alternatively it is isomorphic to Maybe (<a href="https://hackage.haskell.org/package/base-4.16.0.0/docs/Data-List-NonEmpty.html#t:NonEmpty" rel="noreferrer">NonEmpty</a> a)
,它简单地消除了 Just []
的情况。
换句话说,[a]
可以分解为 Maybe
和 NonEmpty
函子的组合。
这样做的结果是您可以将 NonEmpty a
上的任何函数提升为 [a]
上的函数:
liftEmptyable :: (NonEmpty a -> r) -> [a] -> Maybe r
liftEmptyable _ [] = Nothing
liftEmptyable f (x:xs) = Just $ f (x:|xs)
虽然不确定这实际上与您的问题有多大关系。正如 duplode 回答的那样,除了简单的仿函数映射之外,您实际上什么都不做。我们最多可以详细说明 monad 法则确保 fmap
确实表现得好像 length
直接作用于包含的列表:
Just [1,2] >>= return . length
≡ return [1,2] >>= return . length -- def. of `Monad Maybe`
≡ return (length [1,2]) -- left-identity monad law