You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 09:42:04