以下声明给出了一个错误:
type Vec2d = (Float, Float)
type Vec3d = (Float, Float, Float)
-- Rect x y defines a rectangle spanning from (0,0) to (x,y)
data Obj2d = Rect Float Float
| Translate Vec2d Obj2d
-- Cuboid x y z defines a cuboid spanning from (0,0,0) to (x,y,z)
data Obj3d = Cuboid Float Float Float
| Translate Vec3d Obj3d
即Multiple declarations of 'Translate'
。
现在,我想知道为什么引入了此限制?
如果没有限制,可以写
Translate (1, 1) Rect 2 2
和
Translate (1, 2, 3) Cuboid 1 1 1
,听起来自然。
我没有(立即)看到这种情况如何导致解析问题竞标以不允许使用相同的名称,类型可以由参数推断(Rect 2 2
是Obj2d
,Cuboid 1 1 1
是Obj3d
)。
我敢肯定,语言设计师选择一个很好的理由是不允许不同类型的数据构造函数使用相同的名称,但是我想学习:为什么,当没有明显必要时?
(而且类型歧义消除是Haskell的头等大事!)
3
关于由参数推断的类型:您是否知道有时从函数的类型推断参数的类型?
@delnan我不知道...听起来像是对我的答案。我一直认为推断是自下而上的,尽管我可以看到使用类型图另一侧的类型信息来解决歧义,正如您所描述的那样,这是决定性因素...我的想法是返回值类型位于底部顶部是图形和函数调用,分辨率是从底部向上折叠形成的聚合,但这不是全部,您在说什么?毫不奇怪,使用完全推论的依存类型语言,这可能更准确。.–
—
Jimmy Hoffa