我如何获得Haskell中范围函数的类型签名?

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

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

我想尝试获取范围函数[a..a]的类型签名,但似乎该函数是中缀,但只能在列表[] 。 我尝试了以下所有内容,但都没有成功:

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 `..'

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


..不是一个函数,它实际上是语法糖。 它被转换为几个函数之一: enumFromenumFromThenenumFromToenumFromThenTo

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

[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 ..]并得到[False, True]列表。 (不幸的是,由于当前解析含糊不清,你不能写[False..]因为它假定False是一个模块。)


尝试使用lambda。

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

这个符号只是enumFromenumFromTo语法糖,所以它没有真正的传统类型。

链接地址: http://www.djcxy.com/p/43027.html

上一篇: How do I get the type signature of the range function in Haskell?

下一篇: Why is function definition for all types at once not allowed in Haskell?