[英]Bind non-monadic functions to a monad
也許這是一個經常被問到的問題,但我沒有找到答案。
monad的綁定定義如下:
(>>=) :: m a -> (a -> m b) -> m b
目前我正在這樣做:
foo :: Int
foo = sum $ ((*11) . (+2)) `map` [1..4]
我想實現這樣的語法,因為我認為它更具可讀性:
[1..4] >>= (+2) >>= (*11) >>= sum
我不知道正確的運算符而不是>>=
。
此外:foo是198。
在這種情況下最可讀的當然是
sum [ (x+2)*11 | x<-[1..4] ]
但如果你想要它沒有點,沒有額外的parens,只需用infix fmap運算符重寫原始行:
sum $ (*11) . (+2) <$> [1..4]
如果您只想轉動訂單,可以更換.
使用來自Control.Category
的等效翻轉運算符,以及帶翻轉版本的 $
, 例如來自lens
[1..4] & fmap((+2)>>>(*11)) & sum
再說一遍,如果你追求數學優雅並希望它“像monad一樣工作”,這是不可能的,因為這里沒有任何monadic。 然而,你可以爭辯說, sum
是一個Cokleisli箭頭(不可定義,在Haskell 98中) Monoid
-limited列表comonad。 我們可以通過NonEmpty comonad來估算這個並寫
extract $ fromList [1..4] =>> (extract>>>(+2)>>>(*11)) =>> sum.toList
但這太荒謬了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.