理解在Haskell中的all函数中使用括号?

时间:2018-04-20 02:58:52

标签: function haskell

我试图围绕Haskell中的编程约定和规则。我发现令人困惑或难以理解的一件事是使用括号()。任何人都可以向我解释它在all函数的情况下做了什么吗?

all :: (a -> Bool) -> [a] -> Bool
all p xs = and [ p x | x <- xs ]

据我了解,函数的类型显示了类型约束,输入和输出。没有

all :: [a] -> Bool

够了吗?

1 个答案:

答案 0 :(得分:5)

括号做什么

Haskell中的括号用于与大多数其他编程语言非常相似的目的:更改操作的优先级和/或对术语进行分组。

在您的情况下,(a -> Bool)包含在括号中的事实表明函数的第一个参数的类型是a -> Bool。如果没有括号(即签名是all :: a -> Bool -> [a] -> Bool),那么意思是函数的第一个参数的类型是a,函数的第二个参数的类型是{{1 }}

拥有Bool

是不够的

如果那是签名,那么问题就是:这种功能意味着什么?当列表不为空时,它会返回all :: [a] -> Bool吗?或者当它是空的?或者它恰好包含42个元素?功能错误的名称。应该将其命名为True而不是has42Elements

另一方面,如果函数采用类型为all的第一个参数(即一个带a -> Bool并返回a的函数),则表示Bool将“检查此列表中所有元素的此函数是否为all ”。