我刚开始学习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]
我尝试过所有事情,但没有取得任何积极成果。我希望你能帮助我。
答案 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中已经有一个名为id
(id :: 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]