有人可以一步一步地向我解释这个功能的含义吗?
select :: (a->a->Bool) -> a -> a -> a
答案 0 :(得分:8)
正如评论所指出的,这不是一个函数定义,而只是一个类型签名。它表示,对于您可以自由选择的任何类型a
,此函数需要:
a
类型的两个值,并提供Bool
a
并返回另一个a
类型的值。例如,我们可以打电话:
select (<) 1 2
其中a
为Int
,因为(<)
是一个需要两个Int
并返回Bool
的函数。我们可以不致电:
select isPrefixOf 1 2
因为isPrefixOf :: (Eq a) => [a] -> [a] -> Bool
- 即它需要两个列表(假设元素类型支持Eq
uality),但数字不是列表。
然而,由于 parametericity (又名 free theorems ),签名可以告诉我们很多。细节是非常技术性的,但我们可以直觉select
必须返回其两个参数中的一个,因为它没有其他方法来构造类型a
的值,它不知道什么(这可能是证明)。
但除此之外我们无法说清楚。通常,您几乎可以肯定地通过其签名来确定函数的功能。但是当我探索这个签名时,我发现它实际上有很多功能,最明显的是:
select f x y = if f x y then x else y
一些相当异国情调的
select f x y = if f x x && f y y then x else y
名称select
没有多大帮助 - 它似乎告诉我们它将返回两个参数中的一个,但签名已告诉我们。