我对 Yegge(和 Ola Bini)关于静态类型的观点持保留态度。如果您欣赏静态类型给您带来的好处,您将了解您选择的编程语言的类型系统是如何工作的。
IIRC,ML 对元组使用 '*' 语法。 * 是一个有两个元素的元组类型。因此,(1, 2) 将具有 int * int 类型。
Haskell 和 ML 都使用 -> 作为函数。在 ML 中,int * int -> int 是一个函数的类型,它接受一个 int 和 int 的元组并将其映射到一个 int。
当您从另一种语言进入机器学习时,您可能会看到一个看起来与 Ola 引用的错误类似的错误的原因之一是,如果您尝试使用括号和逗号传递参数,就像在 C 或 Pascal 中那样,一个接受两个参数的函数。
问题在于,函数式语言通常将多个参数的函数建模为函数返回函数;所有函数只接受一个参数。如果函数应该接受两个参数,则它会接受一个参数并返回一个包含单个参数的函数,该函数返回最终结果,依此类推。为了使所有这些清晰易读,函数应用只需通过连词即可完成(即将表达式并排放置)。
所以,ML 中的一个简单函数(注意:我使用 F# 作为我的 ML)可能看起来有点像:
let f x y = x + y;;
它有类型:
val f : int -> int -> int
(一个接受整数并返回一个函数的函数,该函数本身接受一个整数并返回一个整数。)
但是,如果你天真地用元组调用它:
f(1, 2)
...你会得到一个错误,因为你将一个 int*int 传递给了一个期待一个 int 的东西。
我认为这是 Ola 试图中伤的“问题”。不过,我认为问题并没有他想的那么严重。当然,在 C++ 模板中情况要糟糕得多。