我试图围绕Haskell中的编程约定和规则。我发现令人困惑或难以理解的一件事是使用括号()。任何人都可以向我解释它在all函数的情况下做了什么吗?
all :: (a -> Bool) -> [a] -> Bool
all p xs = and [ p x | x <- xs ]
据我了解,函数的类型显示了类型约束,输入和输出。没有
all :: [a] -> Bool
够了吗?
答案 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
”。