Haskell中Wadler论文示例里的Con Int是什么?为何需要Con?
关于Haskell中
Con Int的含义与必要性解答 先看Philip Wadler在1995年论文《Monads for functional programming》里的这段类型定义:
data Term = Con Int | Div Term Term
Con Int的含义
这里的Con是**构造器(constructor)**的缩写,它的作用是把Int值包装起来,明确标记这是Term类型的一个合法成员。比如Con 5代表的是一个包含整数5的Term类型值,而非单纯的整数5本身。
为什么不能直接写成data Term = Int | Div Term Term
在Haskell的代数数据类型规则里,这种写法完全不合法,核心原因有两点:
- 代数数据类型的每个分支必须以「构造器」开头,不能直接用现有类型(比如
Int)。构造器相当于类型的"标签",用来区分不同分支的语义。 - 就算语法允许,也会引发语义歧义:拿到一个
Term值时,你没法区分它到底是代表常量的整数,还是其他恰好类型为Int的计算结果——Con的存在就是明确告诉编译器和读代码的人:这个值是Term类型里的常量分支。
举个实际的例子,没有Con连模式匹配都写不对:
-- 带Con的正确匹配逻辑 eval :: Term -> Int eval (Con n) = n eval (Div t1 t2) = eval t1 `div` eval t2 -- 不带Con的错误写法(语法直接报错) eval :: Term -> Int eval n = n -- 编译器分不清n是Term的分支还是普通Int eval (Div t1 t2) = eval t1 `div` eval t2
另外从扩展性角度看,Con的存在让后续扩展Term类型更顺畅。比如之后要加布尔常量分支,只需要写成Con Int | BoolCon Bool | Div Term Term,完全不用改动原有分支的逻辑。
内容的提问来源于stack exchange,提问作者chickenNinja123
相关产品推荐
相关产品推荐

