如何在地图中使用Haskell中的curried函数?

时间:2017-01-02 17:27:08

标签: haskell functional-programming currying

尝试通过重新定义前奏函数来学习如何使用折叠:

import Prelude hiding (sum, product, length, and, or, all, any, filter)

到目前为止,我已经完成了所有的工作,但我无法弄清楚我对所有人做错了什么。我将其定义如下:

and :: [Bool] -> Bool
and = foldr (&&) True

...

all :: (a -> Bool) -> [a] -> Bool
all = and $ map

但是这显示错误说:

Probable cause: ‘map’ is applied to too few arguments

我也尝试将其定义为:

and :: [Bool] -> Bool
and = foldr (&&) True

...

all :: (a -> Bool) -> [a] -> Bool
all f [xs] = and $ map f [xs]

这编译得很好,但是当我试着打电话时它说:

[1 of 1] Compiling Fold             ( Fold.hs, interpreted )
Ok, modules loaded: Fold.
*Fold> all even [0,2,4,6]
*** Exception: Fold.hs:17:1-29: Non-exhaustive patterns in function all

我不明白,因为不应该[xs]匹配任何列表,即使是空列表?为什么我可以在不包括列表但不包括地图的情况下咖喱折叠?任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:2)

您将功能应用程序与组合混合在一起。这有帮助吗?

all :: (a -> Bool) -> [a] -> Bool
all fn = and . (map fn)

在实践中,这相当于您的代码+来自@Carcigenicate的评论