簡體   English   中英

將非monadic函數綁定到monad

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM