关于Steve Yegge关于服务器端Javascript的帖子的评论开始讨论类型系统在语言中的优点,这篇评论描述了:
......来自HM风格系统的例子,你可以得到这样的东西:
expected signature Int*Int->Int but got Int*Int->Int
你能给出一个函数定义(或两个?)和一个会产生错误的函数调用的例子吗?看起来在大型程序中调试可能相当困难.
另外,我可能在米兰达看到过类似的错误吗?(我15年没用过了,所以我对它的记忆含糊不清)
我会把Yegge(和Ola Bini)的观点用于静态打字.如果您了解静态类型为您提供的内容,您将学习如何使用您选择的编程语言的类型系统.
IIRC,ML使用元组的'*'语法.
Haskell和ML都使用 - >用于函数.在ML中,int*int - > int将是一个函数的类型,它接受int和int的元组并将其映射到int.
你可能会看到一个看起来模糊的错误的原因之一就是当你从另一种语言来到ML时引用的那个Ola,如果你尝试使用括号和逗号将参数传递给C或Pascal中的一个函数,有两个参数.
问题是,函数式语言通常将多个参数的函数建模为函数返回函数; 所有函数只接受一个参数.如果函数应该接受两个参数,则它接受一个参数并返回一个参数的函数,该函数返回最终结果,依此类推.为了使所有这些清晰,功能应用程序只需通过连接(即将表达式放在彼此旁边)完成.
所以,ML中的一个简单函数(注意:我使用F#作为我的ML)可能看起来有点像:
let f x y = x + y;;
它有类型:
val f : int -> int -> int
(一个取整数并返回一个函数的函数,该函数本身取一个整数并返回一个整数.)
但是,如果你天真地用元组调用它:
f(1, 2)
...你会得到一个错误,因为你把一个int*int传递给了一个期望int的东西.
我希望这是奥拉试图诽谤的"问题".我不认为这个问题和他想的一样糟糕; 当然,它在C++模板中要糟糕得多.