簡體   English   中英

這個monadic Haskell函數是否已經存在(或者是已知函數的簡單組合)?

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

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