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 `..'
有谁知道如何获取范围函数的类型签名?
答案 0 :(得分:13)
..
不是函数,它实际上是语法糖。它被转换为以下几个函数之一:enumFrom
,enumFromThen
,enumFromTo
或enumFromThenTo
。
它不能是正常的功能,因为它有四种以不同方式工作的形式。也就是说,所有这四个都是有效的:
[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
是一个模块。)
答案 1 :(得分:8)
尝试使用lambda。
> :t \x y -> [x..y]
符号只是enumFrom
和enumFromTo
的语法糖,所以它实际上没有传统类型。