在Ocaml中,具有不同arities的元组具有不同的类型和值构造函数:
# let a = (1, 2, 3);;
val a : int * int * int = (1, 2, 3)
# let b = (1, (2, 3));;
val b : int * (int * int) = (1, (2, 3))
请注意,第二个例子(b)比第一个(a)更灵活,因为b - (2,3)的“尾部” - 本身就是有效值:
# let (_, c) = b;;
val c : int * int = (2, 3)
# let d = snd b;;
val d : int * int = (2, 3)
不将“(1,2,3)”解析为“(1,(2,3))”的原因是什么,而是引入无限(或甚至更糟,有限)数量的新类型和值构造函数对于不同的城市?
答案 0 :(得分:8)
不将“(1,2,3)”解析为“(1,(2,3))”的原因是什么,而是引入无限(或甚至更糟,有限)数量的新类型和值构造函数对于不同的城市?
ML类型系统的设计旨在追求更强大的静态类型检查,以便在编译时捕获尽可能多的错误。
你的建议会大大削弱类型系统,因为它不再能够区分(1, 2, 3)
和(1, (2, 3))
这是相反的方向。
在实践中,我可以告诉你,ML制作这样的区别在过去我的生产代码中发现了真正的错误。我在这种情况下重视ML设计。