繁体   English   中英

无法理解简单的Haskell函数吗?

[英]Can't understand a simple Haskell function?

有人可以逐步向我解释此功能的含义吗?

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

正如评论所指出的那样,这不是函数定义,而只是类型签名。 它说,对于您可以自由选择的任何类型的a ,此函数均预期:

  • 该函数采用两个类型a值并给出一个Bool
  • 类型a两个值

它返回类型a另一个值。 因此,例如,我们可以调用:

select (<) 1 2

其中aInt ,因为(<)是一个接受两个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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM