Monad可以將(與原始函式采用Just [1,2]的型別不同)傳遞給。length>>= return . length
Just [1,2] >>= return . length
我可以說這Monad使得使用 可以看到Maybe [a]與[a]on length同構(>>=, return)嗎?(當然它們并不是真正同構的。)
我可以在這種情況下選擇術語“同構”嗎?
uj5u.com熱心網友回復:
您的示例最終說明的是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
但是,沒有函式,因為如果輸入函式給出 a (Maybe a -> Maybe b) -> (a -> b),則無法獲得結果。雖然有一些特定的函子是同構的(是一個例子),但一般情況并非如此。bMaybe a -> Maybe bNothingfmapIdentity
uj5u.com熱心網友回復:
[a]與with的商型別同構并且被認為是等價的. 或者,它與 同構,這簡單地消除了這種情況。
換句話說,可以分解為和函子的組合。Maybe [a]NothingJust []Maybe (NonEmpty a)Just [][a]MaybeNonEmpty
這樣做的結果是您可以將任何函式提升NonEmpty a到函式 on [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
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/444376.html
