Monad m => a - > [a - > ma] - > ma

pas*_*cal 13 haskell

我是Haskell的新手,我想知道是否有更好的方法来确定是否有一个复制库功能而不是Hoogle?

一个很好的例子:我有许多f :: Monad a => a -> m a我希望链接在一起的函数,比如

f1234 x = (return x) >>= f1 >>= f2 >>= f3 >>= f4
Run Code Online (Sandbox Code Playgroud)

但我宁愿写信

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

看起来非常基本,基础库是否提供了相当于的东西chain

And*_*ewC 17

Hoogle对此很有用,绝对是找到相同类型功能的正确工具.

鉴于它很简单,并且它没有出现在任何常见的地方,你也可以自己编写它从一些模糊的模块中导入它,部分原因是你不会导入其他任何东西.

(旁白:有些软件包似乎无法从hoogle中搜索到,所以如果你知道你所追求的功能,模块或软件包名称并且hoogle不知道,请使用hayoo.)

我想塞

(>=>) :: Monad m => (a -> m b) -> (b -> m c) -> (a -> m c)
Run Code Online (Sandbox Code Playgroud)

来自Control.Monad.这是我一直想要的构图操作员,直到找到它.与>>=我看来,使用monad是一种更自然的方式.

你甚至可以直接使用它,它是如此清晰:

f1234 = f1 >=> f2 >=> f3 >=> f4
Run Code Online (Sandbox Code Playgroud)

它会显示出来是否存在(a -> m a) -> (a -> m a) -> (a -> m a),所以未来的策略如果你正在寻找一些结合了某些东西的东西就是搜索一个结合了两个并使用其中一个fold函数的函数.

从而

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

f1234 = chain' [f1,f2,f3,f4]
Run Code Online (Sandbox Code Playgroud)

要么

chain'' :: Monad m => a -> [a -> m a] -> m a
chain'' = flip $ foldr (>=>) return
Run Code Online (Sandbox Code Playgroud)

如果你愿意,但无论如何你的确很好.

  • 请注意,`f1> => f2> => f3> => f4`比`chain'[f1,f2,f3,f4]`更通用,因为它允许组成`a - > mb`和`b - > mc`. (5认同)