haskell中(:==)的类型签名无效

时间:2018-02-03 19:02:12

标签: haskell types

如果我定义以下功能:

(:==) :: a -> b -> (a,b)
x :== y = (x,y)

我收到错误:

Op.hs:2:1: error:
    Invalid type signature: (:==) :: ...
    Should be of form <variable> :: <type>
  |
2 | (:==) :: a -> b -> (a,b)
  | ^^^^^

任何人都可以解释原因吗?

2 个答案:

答案 0 :(得分:12)

(:==)不是Haskell中函数或变量标识符的有效符号。以:开头的符号保留给构造函数(data MyData a b = a :== b是一个有效的替代) 为函数选择一个不同的名称,或者使用(,)这是一个完全有效的函数,可以完成函数的功能,或者使用上面括号中的数据类型。

来源:Haskell 98 Report - Lexical Structure - Section 2.4

答案 1 :(得分:4)

:==不是函数的有效标识符。以冒号':'开头的运算符标识符保留给构造函数。

请考虑定义您自己的配对类型:

data MyPair a b = a :== b

如果您正在构建某种特定于域的小型嵌入式语言,则可以为该类型提供有意义的名称,以区别于普通对。