Я бы взял мнение Йегге (и Олы Бини) о статической типизации с частичкой соли. Если вы понимаете, что дает статическая типизация, вы узнаете, как работает система типов выбранного вами языка программирования.
IIRC, ML использует синтаксис '*' для кортежей. * - это тип кортежа с двумя элементами. Итак, (1, 2) будет иметь тип int * int.
И Haskell, и ML используют -> для функций. В ML int * int -> int будет типом функции, которая принимает кортеж int и int и отображает его в int.
Одна из причин, по которой вы можете увидеть ошибку, которая выглядит смутно, как та, которую Ола цитирует при переходе на ML с другого языка, заключается в том, что вы пытаетесь передать аргументы, используя скобки и запятые, как в C или Pascal, для функция, которая принимает два параметра.
Проблема в том, что функциональные языки обычно моделируют функции нескольких параметров как функции, возвращающие функции; все функции принимают только один аргумент. Если функция должна принимать два аргумента, она вместо этого принимает аргумент и возвращает функцию с одним аргументом, которая возвращает конечный результат, и так далее. Чтобы сделать все это разборчивым, применение функции выполняется просто соединением (то есть размещением выражений рядом друг с другом).
Итак, простая функция в ML (примечание: я использую F # в качестве моего ML) может выглядеть примерно так:
let f x y = x + y;;
Имеет тип:
val f : int -> int -> int
(Функция, принимающая целое число и возвращающая функцию, которая сама принимает целое число и возвращает целое число.)
Однако, если вы наивно называете его кортежем:
f(1, 2)
... вы получите ошибку, потому что вы передали int * int чему-то ожидающему int.
Я ожидаю, что это "проблема", в которой Ола пытался бросить оскорбления. Я не думаю, что проблема настолько плоха, как он думает; конечно, в шаблонах C ++ это намного хуже.