[英]Can't understand a simple Haskell function?
有人可以逐步向我解释此功能的含义吗?
select :: (a->a->Bool) -> a -> a -> a
正如评论所指出的那样,这不是函数定义,而只是类型签名。 它说,对于您可以自由选择的任何类型的a
,此函数均预期:
a
值并给出一个Bool
a
两个值 它返回类型a
另一个值。 因此,例如,我们可以调用:
select (<) 1 2
其中a
是Int
,因为(<)
是一个接受两个Int
并返回Bool
的函数。 我们无法致电:
select isPrefixOf 1 2
因为isPrefixOf :: (Eq a) => [a] -> [a] -> Bool
即,它包含两个列表(前提是元素类型支持Eq
uality),但数字不是列表。
但是由于参数性 (也称为自由定理 ),签名可以告诉我们很多。 细节是相当技术性的,但是我们可以直觉select
必须返回它的两个参数之一,因为它没有别的方法来构造a
类型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
名称并没有多大帮助-似乎告诉我们它将返回两个参数之一,但是签名已经告诉我们了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.