无法理解简单的Haskell功能?

时间:2017-11-09 08:00:24

标签: haskell

有人可以一步一步地向我解释这个功能的含义吗?

select :: (a->a->Bool) -> a -> a -> a

1 个答案:

答案 0 :(得分:8)

正如评论所指出的,这不是一个函数定义,而只是一个类型签名。它表示,对于您可以自由选择的任何类型a,此函数需要:

  • 一个函数,它接受a类型的两个值,并提供Bool
  • 类型a
  • 的两个值

并返回另一个a类型的值。例如,我们可以打电话:

select (<) 1 2

其中aInt,因为(<)是一个需要两个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没有多大帮助 - 它似乎告诉我们它将返回两个参数中的一个,但签名已告诉我们。