Haskell中由Haskell中的特殊字符组成的许多函数都是中缀函数.这些措施包括*,+,==,/,等联系到你放在括号中的功能和执行功能等类型的签名:t,就像这样:
GHCi> :t (==)
(==) :: Eq a => a -> a -> Bool
Run Code Online (Sandbox Code Playgroud)
我想尝试获取范围函数的类型签名[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 `..'
Run Code Online (Sandbox Code Playgroud)
有谁知道如何获得范围函数的类型签名?
Tik*_*vis 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
Run Code Online (Sandbox Code Playgroud)
这些表格分别使用我提到的四个功能.
如果它只是一个普通的运算符,1..会给你一个部分应用的函数; 相反,它产生一个列表.此外,对于正常函数,[1,2..10]符号将被解析为[1,(2..10)]实际上它全部变为单个函数,将所有三个数字作为参数.
这些函数都是Enum类的一部分,因此..符号适用于作为其一部分的任何类型.例如,您可以编写[False ..]并获取列表[False, True].(不幸的是,由于当前的解析模糊,你不能写,[False..]因为它假设False是一个模块.)
尝试使用lambda.
> :t \x y -> [x..y]
Run Code Online (Sandbox Code Playgroud)
符号只是语法糖enumFrom,enumFromTo所以它并没有真正的传统类型.