我可以说 Monad 可以将某些类型视为同构吗?

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

  • 非正式地说,这是提升一个函数,而不是表达任何同构。`fmap` 将函数从 `[a]` 提升为 `Maybe [a]` 的函数 (2认同)

lef*_*out 5

[a]与 with的商类型同构并且被认为是等价的。或者它与 是同构的,这只是消除了这种情况。\n \n换句话说,可以被分解为和的组合Maybe [a]NothingJust []Maybe (NonEmpty a)Just []
[a]MaybeNonEmpty

\n

这样做的结果是你可以将任何函数提升NonEmpty a到一个函数上[a]

\n
liftEmptyable :: (NonEmpty a -> r) -> [a] -> Maybe r\nliftEmptyable _ [] = Nothing\nliftEmptyable f (x:xs) = Just $ f (x:|xs)\n
Run Code Online (Sandbox Code Playgroud)\n

但不确定这实际上与你的问题有很大关系。正如 duplode 回答的那样,除了简单的函子映射之外,您实际上什么也不做。我们最多可以详细说明单子定律确保确实fmap表现得好像length直接作用于所包含的列表一样:

\n
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\n
Run Code Online (Sandbox Code Playgroud)\n