Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 单子m=>;a->;[a->;并购]->;我是_Haskell - Fatal编程技术网

Haskell 单子m=>;a->;[a->;并购]->;我是

Haskell 单子m=>;a->;[a->;并购]->;我是,haskell,Haskell,我是Haskell的新手,我想知道是否有比Hoogle更好的方法来确定是否复制了库功能 举个例子:我有很多函数f::Monad a=>a->ma,我想把它们链接在一起,比如 f1234 x = (return x) >>= f1 >>= f2 >>= f3 >>= f4 但我宁愿写 chain :: Monad m => a -> [a -> m a] -> m a chain = foldl (>>=) &l

我是Haskell的新手,我想知道是否有比Hoogle更好的方法来确定是否复制了库功能

举个例子:我有很多函数
f::Monad a=>a->ma
,我想把它们链接在一起,比如

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::Monad m=>a->[a->ma]->ma
chain=foldl(>>=)返回
f1234=(翻转链)[f1、f2、f3、f4]

这似乎非常基本,基本库是否提供了与
相当的东西?

Hoogle的好处在于此,它绝对是查找相同类型函数的正确工具

考虑到它很简单,而且在任何通常的地方都不会出现,您可以自己编写它,也可以从某个模糊的模块导入它,部分原因是您不会导入一大堆其他内容

(旁白:有些包似乎无法从hoogle中搜索,因此如果您知道您要查找的函数、模块或包名,而hoogle不知道,请使用hayoo。)

我想插上插头

(>=>) :: Monad m => (a -> m b) -> (b -> m c) -> (a -> m c)
Control.Monad
。这是我一直想要的合成运算符,直到找到为止。在我看来,使用monad比使用
>=
更自然

你甚至可以直接使用它,非常清楚:

f1234 = f1 >=> f2 >=> f3 >=> f4
如果你选择
(a->ma)->(a->ma)->(a->ma)->(a->ma)
,它就会出现。因此,如果你正在寻找一个结合了一系列内容的内容,那么未来的策略是搜索一个结合了两个内容的功能,并使用其中一个
折叠
功能

因此


如果您愿意,但您的也可以。

hoogle的另一种选择是凭一点直觉猜测最合适的模块,然后浏览其文档页面。您可能会找到其他缩短代码的方法,或者找到其他非常有用的函数来记住。这种策略最适用于基本包,然后适用于“抽象”模块(如Monad和Applictive,之后是更高级的可折叠和可遍历)和参数化的模式化数据类型(如Maybe、List)。尽管您也可以为更多使用的数据类型(对于我,Map/Set和后来的Monad Transformers)这样做。返回
非常清晰,IMHO。请注意,
f1>=>f2>=>f3>=>f4
chain'[f1,f2,f3,f4]
更通用,因为它允许组合
a->mb
b->mc
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