[英]Does this monadic Haskell function already exist (or is a simple combination of known functions)?
我是Haskell的初學者,但是在數學,特別是代數方面有很多背景,所以像“monad是endofunctors類別中的monoid”這樣的陳述對我來說不是問題。
即便如此,我只是了解Haskell中monad的一部分,在學習過程中我發現自己編寫了以下函數:
bindMap ::(Monad m) => [a -> m a] -> m a -> m a
bindMap (f:fs) s = bindMap fs (s >>= f)
bindMap _ s = s
這完全符合我的目的,但它似乎是一個顯而易見的功能,我認為我應該能夠找到它或用一些簡單的組合器來定義,或者(更有可能)我應該以不同的方式思考事物。
我最初使用類型簽名編寫它
[a -> [a]] -> [a] -> [a]
這可能會更好地表明我所追求的目標。 我們的想法是加入一系列功能
a -> [a]
成為一個大功能。 我在Sudoku求解器中使用它。 如果您認為可能有更多相關背景,請告訴我。
它也叫做flip (foldl (>>=))
。
一般來說,如果您正在尋找像[a] -> b
這樣的函數,那么您正在尋找折疊。 要編寫monad中的對象,您可能首先到達(>>=)
。 因為foldl
以與你想要的相反的順序接受參數,因此flip
就在那里。
當我們發現自己試圖將兩個或更多“事物”結合起來以獲得相同類型的另一個“事物”時,通常會有一個幺半群潛伏在附近。
對於純函數,有Endo幺半群。
奇怪的是,Kleisli箭似乎沒有標准的模擬。 它會是這樣的:
import Data.Monoid
import Control.Monad
newtype EndoM m a = EndoM { appEndoM :: a -> m a }
instance Monad m => Monoid (EndoM m a) where
mempty = EndoM return
EndoM f `mappend` EndoM g = EndoM (f >=> g)
main :: IO ()
main = putStrLn . show . kleisli $ 5
where
kleisli = appEndoM . mconcat . map EndoM $ [return,Just,const Nothing]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.