【发布时间】:2015-01-22 11:55:39
【问题描述】:
我学习 Haskell。来自 Haskell 2010 文档:
- 以冒号开头的运算符符号是构造函数。
- 以任何其他字符开头的运算符符号是普通标识符。
我不明白第一句话。我知道存在数据构造函数和类类型构造函数。这个case是什么构造函数?也许我需要一个代码示例。
【问题讨论】:
-
小写字母数字标识符对应大写标识符,例如(非
:)符号运算符对应以冒号开头的符号。
标签: haskell
我学习 Haskell。来自 Haskell 2010 文档:
- 以冒号开头的运算符符号是构造函数。
- 以任何其他字符开头的运算符符号是普通标识符。
我不明白第一句话。我知道存在数据构造函数和类类型构造函数。这个case是什么构造函数?也许我需要一个代码示例。
【问题讨论】:
:)符号运算符对应以冒号开头的符号。
标签: haskell
你可以定义类似的东西
data Symbolic n
= Constant n
| Variable String
| Symbolic n :+ Symbolic n
| Symbolic n :* Symbolic n
deriving (Show)
GHCi> 让 v = 变量; c = 常数
GHCi> c 2 :* v"a" :+ c 3
(常数 2:* 变量“a”):+ 常数 3
这就是第一个短语所指的。
【讨论】:
我知道存在数据构造函数和类类型构造函数。这个case是什么构造函数?
在标准 Haskell 中,只有数据构造函数可以是符号的,类型名称必须是字母数字的。如果启用 GHC 扩展 TypeOperators,类型名称也可以是符号,允许您定义以 : 开头的类型构造函数。
【讨论】:
TypeOperators 扩展?
-XTypeOperators 标志。您也可以在 Haskell 文件的开头添加 {-# LANGUAGE TypeOperators #-} 以获得相同的效果,而无需任何编译器选项。
Symbolic重命名为Symbolic#。但是 ghci 不加载它。
Symbolic 重命名为 :-* 或其他以冒号开头的符号组合。还要记住,符号名称在不括在括号中时使用中缀,因此它可以是 data a :-* b = ... 或 data (:-*) n = ...。
:+ 和:*,但您尝试使用您没有在任何地方定义的:-*。 let n :: (:-) Integer = Constant 1 :+ Constant 2 之类的东西应该可以工作(类型签名当然是可选的,但是这样类型构造函数就会出现在代码中)。