3

私はHaskellの比較的初心者ですが、数学、特に代数のバックグラウンドが豊富であるため、「モナドはエンドファンクターのカテゴリのモノイドです」などのステートメントは私にとって問題ではありません。

それでも、私は Haskell のモナドを理解する方法の一部にすぎません。学習の過程で、次の関数を書いていることに気付きました。

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]

1 つの大きな機能に。数独ソルバーで使用しています。より関連性の高いコンテキストがあると思われる場合は、お知らせください。

4

2 に答える 2

10

とも呼ばれflip (foldl (>>=))ます。

一般に、 のような関数を探している[a] -> b場合は、フォールドを探しています。モナドでオブジェクトを構成するには、最初に(>>=). は、必要な順序とは逆の順序で引数を取るためですflipfoldl

于 2013-08-21T21:13:49.713 に答える
5

同じタイプの別の「もの」を取得するために 2 つ以上の「もの」を組み合わせようとするとき、多くの場合、近くにモノイドが潜んでいます。

純粋関数には遠藤モノイドがあります。

奇妙なことに、クライスリの矢の標準的な類似品はないようです。次のようになります。

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]    
于 2013-08-21T21:36:59.797 に答える