Haskell类型定义是错误的

时间:2017-05-11 18:53:38

标签: haskell

我刚开始学习Haskell,我有使用高阶函数创建具有以下类型定义的函数的赋值

-- compr :: (a->b) -> (a -> Bool) -> [a] -> [b]

该功能不相关,可以是最简单的功能,所以我的想法是这样的:

identity x = x
booleans x | x == 1  = True
           | x ==0 = False
           | otherwise = False

compr identity booleans xs  =  filter booleans(map (identity) xs)

但此功能具有此类型

compr :: (a->b) -> (b -> Bool) -> [a] -> [b]

我尝试过所有事情,但没有取得任何积极成果。我希望你能帮助我。

2 个答案:

答案 0 :(得分:2)

你几乎得到了它,但是你需要在地图之前应用过滤器。这样,过滤器就会应用于[a]而不是[b],并且谓词会获得正确的类型。

> compr identity booleans xs  = map identity (filter booleans xs)
> :t compr
compr :: (a -> b) -> (a -> Bool) -> [a] -> [b]

顺便说一句,我发现你用于变量的名称具有误导性。例如,identity定义中的compr变量与您之前声明的identity函数无关。

我建议您使用更通用的变量名称,例如

> compr f p xs  = map f (filter p xs)

其中f代表"功能"和p用于谓词。

答案 1 :(得分:0)

Haskell中已经有一个名为idid :: a -> a)的标准库函数来替换你的identity函数。因此,根据您定义booleans函数的方式,您可以简化comp函数,如下所示;

booleans x | x == 1    = True
           | otherwise = False

compr :: (a -> Bool) -> [a] -> [a]
compr =  filter booleans . map id

*Main> compr booleans [1,2,3,4]
[1]