13

私は Haskell を初めて使用します。Hoogle よりもライブラリ機能が重複しているかどうかを確認するためのより良い方法があるのだろうか?

f :: Monad a => a -> m a適切な例:一緒にチェーンしたい関数がいくつかあります。

f1234 x = (return x) >>= f1 >>= f2 >>= f3 >>= f4

でも書いた方がいいよ

chain :: Monad m => a -> [a -> m a] -> m a
chain = foldl (>>=) <$> return
f1234 = (flip chain) [f1, f2, f3, f4]

それは非常に基本的なようですが、ベースライブラリは同等のものを提供していchainますか?

4

1 に答える 1

17

Hoogle はこれに適しています。間違いなく、同じ型の関数を見つけるための適切なツールです。

それが簡単で、通常の場所のどこにも現れないことを考えると、他のものの負荷全体をインポートしないという理由もあって、あいまいなモジュールからインポートするのと同じように自分で書くこともできます。

(余談: いくつかのパッケージは hoogle から検索できないようです。そのため、探している関数、モジュール、またはパッケージ名がわかっているが、hoogle が知らない場合は、hayoo を使用してください。)

プラグインしたい

(>=>) :: Monad m => (a -> m b) -> (b -> m c) -> (a -> m c)

からControl.Monad。見つけるまでずっと欲しかった合成演算子です。>>=私の見解よりも、モナドを扱うのはより自然な方法です。

直接使用することもできます。

f1234 = f1 >=> f2 >=> f3 >=> f4

をフーグルすると表示される(a -> m a) -> (a -> m a) -> (a -> m a)ため、何かのリストを組み合わせたものを探している場合の今後の戦略は、2 つを組み合わせた関数を検索し、関数の 1 つを使用することfoldです。

したがって

chain' :: Monad m => [a -> m a] -> a -> m a
chain' = foldr (>=>) return

f1234 = chain' [f1,f2,f3,f4]

また

chain'' :: Monad m => a -> [a -> m a] -> m a
chain'' = flip $ foldr (>=>) return

あなたが望むなら、あなたのものはとにかく大丈夫です。

于 2012-10-06T00:43:01.137 に答える