【问题标题】:An operator symbol starting with a colon is a constructor以冒号开头的运算符符号是构造函数
【发布时间】:2015-01-22 11:55:39
【问题描述】:

我学习 Haskell。来自 Haskell 2010 文档:

  • 以冒号开头的运算符符号是构造函数。
  • 以任何其他字符开头的运算符符号是普通标识符。

我不明白第一句话。我知道存在数据构造函数类类型构造函数。这个case是什么构造函数?也许我需要一个代码示例。

【问题讨论】:

  • 小写字母数字标识符对应大写标识符,例如(非:)符号运算符对应以冒号开头的符号。

标签: haskell


【解决方案1】:

你可以定义类似的东西

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

这就是第一个短语所指的。

【讨论】:

  • 谢谢。我不明白您代码中的最后两行。你能帮我扩展一下吗?
  • 在 ghci 中试用示例。
  • 谢谢,但我还不明白这种行为的好处。
  • 哦,我明白了!谢谢!
【解决方案2】:

我知道存在数据构造函数和类类型构造函数。这个case是什么构造函数?

在标准 Haskell 中,只有数据构造函数可以是符号的,类型名称必须是字母数字的。如果启用 GHC 扩展 TypeOperators,类型名称也可以是符号,允许您定义以 : 开头的类型构造函数。

【讨论】:

  • 我想试试。如何启用TypeOperators 扩展?
  • @Bush 您可以在调用 ghc 或 ghci 时添加 -XTypeOperators 标志。您也可以在 Haskell 文件的开头添加 {-# LANGUAGE TypeOperators #-} 以获得相同的效果,而无需任何编译器选项。
  • 我添加它并将Symbolic重命名为Symbolic#。但是 ghci 不加载它。
  • @Bush 名称必须全部为符号或全部为字母数字。如前所述,符号构造函数名称需要以冒号开头(否则它是类型变量)。因此,您需要将 Symbolic 重命名为 :-* 或其他以冒号开头的符号组合。还要记住,符号名称在不括在括号中时使用中缀,因此它可以是 data a :-* b = ...data (:-*) n = ...
  • @Bush 在您显示的代码中,您定义了数据构造函数:+:*,但您尝试使用您没有在任何地方定义的:-*let n :: (:-) Integer = Constant 1 :+ Constant 2 之类的东西应该可以工作(类型签名当然是可选的,但是这样类型构造函数就会出现在代码中)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-14
  • 2012-08-30
  • 1970-01-01
  • 2018-07-20
  • 2019-08-06
  • 2018-10-20
相关资源
最近更新 更多