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

Haskell中newtype与data重复定义报错及概念疑问

解答:Haskell中data与newtype同名声明冲突的原因

Haskell里,data和newtype本质上都是用来定义类型构造器的语法,它们生成的类型构造器属于同一命名空间。在同一个作用域下,绝对不允许重复定义同名的类型构造器——不管你用data还是newtype,也不管类型的字段数量是多少,只要名字重复就会触发“Multiple declarations”错误。

你提到LYAH里说newtype是单字段的包装类型且性能更优,这说的是它的底层实现特性:newtype编译后会和被包装的原始类型共享内存表示,没有额外的运行时开销。但这和类型构造器的命名规则完全是两码事——哪怕newtype只含一个字段,它依然是一个独立的类型构造器声明,和用data定义的同名构造器会产生命名冲突。

举个简单例子,哪怕你写:

data Frank a b = Frank a
newtype Frank a b = Frank b

编译器照样会报错,因为两个声明都在定义名为Frank的类型构造器,这违反了Haskell的命名唯一性规则。

你去掉data声明后代码正常运行,就是因为此时只有一个Frank类型构造器的定义,编译器能正确识别它,自然不会再报错。

内容的提问来源于stack exchange,提问作者Piskator

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 23:15:41