Lio*_* L. 2 monads haskell isomorphic
Monad可以将(与原始函数采用的Just [1,2]类型不同)传递给。length>>= return . length
Just [1,2] >>= return . length
Run Code Online (Sandbox Code Playgroud)
我可以说这Monad使得使用 可以看到Maybe [a]与[a]on length同构(>>=, return)吗?(当然它们并不是真正同构的。)
这种情况我可以选择“同构”这个词吗?
dup*_*ode 11
你的例子最终说明的是这Maybe是一个函子:如果你有一些函子f :: a -> b,你可以用保留身份和组合的方式fmap将其转换为函子。Monad 是函子,与相同。在你的例子中,我们有由函子转换的函数。fmap f :: Maybe a -> Maybe b \f m -> m >>= return . ffmap f mlengthMaybe
这种情况我可以选择术语“同构”吗?
并不真地。fmapforMaybe不是同构。同构需要有一个双面逆来消除它,在这种情况下,类似于:
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
Run Code Online (Sandbox Code Playgroud)
但是,没有函数,因为如果输入函数给出 ,(Maybe a -> Maybe b) -> (a -> b)则无法获得结果。虽然存在同构的特定函子(这是一个例子),但一般情况并非如此。bMaybe a -> Maybe bNothingfmapIdentity
[a]与 with的商类型同构并且被认为是等价的。或者它与 是同构的,这只是消除了这种情况。\n \n换句话说,可以被分解为和的组合Maybe [a]NothingJust []Maybe (NonEmpty a)Just [][a]MaybeNonEmpty。
这样做的结果是你可以将任何函数提升NonEmpty a到一个函数上[a]:
liftEmptyable :: (NonEmpty a -> r) -> [a] -> Maybe r\nliftEmptyable _ [] = Nothing\nliftEmptyable f (x:xs) = Just $ f (x:|xs)\nRun Code Online (Sandbox Code Playgroud)\n但不确定这实际上与你的问题有很大关系。正如 duplode 回答的那样,除了简单的函子映射之外,您实际上什么也不做。我们最多可以详细说明单子定律确保确实fmap表现得好像length直接作用于所包含的列表一样:
Just [1,2] >>= return . length\n \xe2\x89\xa1 return [1,2] >>= return . length -- def. of `Monad Maybe`\n \xe2\x89\xa1 return (length [1,2]) -- left-identity monad law\nRun Code Online (Sandbox Code Playgroud)\n