我撰寫了一個程式來Maybe從一對中拉出一個:
deMaybe :: (a, Maybe b) -> Maybe (a, b)
deMaybe (_, Nothing) = Nothing
deMaybe (x,Just y) = Just (x, y)
我知道這Maybe是一個 monad 并且(,) a是一個仿函式(在其他型別類中)。我想知道我是否缺少更高級別的功能,例如:
commute :: (Functor f, Monad m) => f (m a) -> m (f a)
我的問題是:我可以deMaybe用更一般的型別簽名來寫,比如假設的commute,承認我正在嘗試將一個函子換成另一個函子嗎?這可以使用諸如fmap, >>=, pure, &c 之類的函式來完成嗎?
uj5u.com熱心網友回復:
您可以使用sequence :: (Traversable t, Monad m) => t (m a) -> m (t a),但這需要Traversable. 對于t ~ (b, )和m ~ Maybe,因此可以這樣作業:
Prelude> sequence (2, Just 3)
Just (2,3)
Prelude> sequence (2, Nothing)
Nothing
ATraversable是資料結構的型別類,可以轉換為具有相同形狀的專案。我們需要它來構造一個 2 元組(或串列,或類似的東西)。
或者我們可以sequenceA :: (Traversable t, Applicative f) => t (f a) -> f (t a)像@chepner 所說的那樣使用,這更通用,因為所有Monads 也是Applicatives:
Prelude> sequenceA (2, Just 3)
Just (2,3)
Prelude> sequenceA (2, Nothing)
Nothing
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/468447.html
