5

Haskell 中的许多由 Haskell 中的特殊字符组成的函数都是中缀函数。其中包括*, +, ==,/等。要获取此类函数的类型签名,请将函数放在括号中并执行:t,如下所示:

GHCi> :t (==)
(==) :: Eq a => a -> a -> Bool

我想尝试获取 range 函数的类型签名[a..a],但似乎这个函数是中缀的,但只能在 list 中使用[]。我尝试了以下所有方法,但都没有奏效:

GHCi> :t (..)
<interactive>:1:2: parse error on input `..'
GHCi> :t ([..])
<interactive>:1:3: parse error on input `..'
GHCi> :t [..]
<interactive>:1:2: parse error on input `..'
GHCi> :t ..
<interactive>:1:1: parse error on input `..'

有谁知道如何获取范围函数的类型签名?

4

2 回答 2

13

..不是一个函数,它实际上是语法糖。它被翻译成以下几个函数之一:enumFromenumFromThen或。enumFromToenumFromThenTo

它不可能是一个正常的功能,因为它有四种以不同方式工作的形式。也就是说,所有这四个都是有效的:

[1..]     -- enumFrom 1
[1,2..]   -- enumFromThen 1 2
[1..10]   -- enumFromTo 1 10
[1,2..10] -- enumFromThenTo 1 2 10

这些表格分别使用了我提到的四个功能。

如果它只是一个普通的运算符,1..会给你一个部分应用的功能;相反,它会生成一个列表。此外,对于普通函数,[1,2..10]符号将被解析为[1,(2..10)]实际上它全部变成一个函数,将所有三个数字作为参数。

这些函数都是Enum类的一部分,因此该..符号适用于属于它的任何类型。例如,您可以编写[False ..]并获取 list [False, True]。(不幸的是,由于当前的解析模棱两可,你不能写[False..],因为它假设False是一个模块。)

于 2013-02-01T06:33:22.397 回答
8

尝试使用 lambda。

> :t \x y -> [x..y]

该符号只是语法糖enumFromenumFromTo因此它实际上没有常规类型。

于 2013-02-01T06:32:29.997 回答