В Haskell есть типы продуктов с облегченным синтаксисом, написанные (,)
. Можно было бы подумать, что тип суммы с легким синтаксисом, например, (Int | String)
, был бы отличной идеей. Реальность сложнее. Давайте посмотрим почему (я беру некоторые вольности с Num
, они не важны).
if someCondition then 42 else "helloWorld"
Если при этом должно возвращаться значение типа типа (Int | String)
, то что должно возвращать следующее значение?
if someCondition then 42 else 0
(Int | Int)
, очевидно, но если это отличается от простогоInt
тогда у нас большие проблемы. Таким образом, (Int | Int)
должен быть идентичен обычному Int
.
. Сразу видно, что это не просто упрощенный синтаксис для типов сумм, а совершенно новая языковая функция. Другой тип системы типов, если хотите. Должен ли он быть у нас?
Давайте посмотрим на эту функцию.
mysteryType x a b = if x then a else b
Теперь, какой тип имеет mysteryType
? Очевидно
mysteryType :: Bool -> a -> b -> (a|b)
верно? А что если a
и b
одного типа?
let x = mysteryType True 42 0
Это должно быть просто Int
, как мы договорились ранее. Теперь mysteryType
иногда возвращает тип анонимной суммы, а иногда нет, в зависимости от того, какие аргументы вы передаете. Как бы вы сопоставили шаблон с таким выражением? Что на земле вы можете сделать с этим? За исключением тривиальных вещей, таких как «show» (или любых других методов классов типов, которые он будет использовать), не так уж много. Если только вы не добавите информацию о типе времени выполнения к языку, то есть typeof
будет доступен - и это сделает Haskell совершенно другим языком.
Так что да. Почему Haskell не является TypeScript? Потому что нам не нужен другой TypeScript. Если вам нужен TypeScript, вы знаете, где его найти.