Почему они не эквивалентны?
show $ if someCondition then someInt else some double
а также
if someCondition then show someInt else show someDouble
Я понимаю, что если вы изолируете if ... else
часть в первом примере от выражения, то вы не сможете представить его тип анонимным типом суммы Int | Double
, например, чем-то, что вы могли бы легко сделать в TypeScript (упоминая TypeScript, потому что это langauge, который я часто использовал, и который поддерживает типы сумм), и должен был бы прибегнуть к использованию Either
данных, которые затем на основе этого вызывали бы show
.
Пример, который я привел здесь, тривиален, но для меня имеет больше смысла думать: «Хорошо, мы собираемся что-то показать, и это зависит от чего-то someCondition
», а не «Хорошо, если someCondition имеет значение true, тогда покажите someInt, иначе покажи someDouble», а также позволяет для меньшего дублирования кода (здесь шоу повторяется дважды, но это также может быть приложение с длинными функциями и вместоif ... else
него может учитываться> 2 ветви)
На мой взгляд, компилятору должно быть легко проверить, может ли каждый из типов, составляющих тип суммы (здесь Int | Double
), использоваться в качестве параметра для show
функции, и решить, являются ли типы правильными или нет. Еще лучше то, что show
функция всегда возвращает string
значения независимо от типов параметров, поэтому компилятору не нужно переносить все возможные «ветви» (то есть все возможные типы).
Это по выбору, что такая функция не существует? Или, как мне кажется, реализовать это сложнее?
источник
if ... then ... else ...
, должен иметь тот же тип вthen
иelse
части. Вы можете видеть это как троичный оператор в некоторых языках программирования.making all conversions explicit
. В моем вопросе я не хочу, чтобы Haskell использовалInt
aDouble
или наоборот. Я просто использовал эти два типа в качестве примера. Вы могли бы заменить каждыйInt
сa
иDouble
сb
в моем вопросе , где оба типа наследуютShow
. Я понимаю, чтоanonymous sum types
в Haskell их нет, но я хотел бы знать, почему это так и что мешает нам разработать язык для его использования.x :: Int | Bool
и нам нужно скомпилироватьshow x
, нет простого способа узнать, какой указатель на функцию использовать для вызоваshow
, в RTS на основе стирания типа. Мы, вероятно, должны были бы хранить некоторую информацию уровня типа во время выполнения.(String, Int)
не является анонимным Это обычный продукт с забавным синтаксисом.(String | Int)
было бы совсем по-другому. Начните с вопроса о том,(Int|Int)
должен ли он быть идентичнымInt
и почему.Ответы:
Все части выражения должны быть хорошо напечатаны. Тип
if someCondition then someInt else someDouble
должен быть примерно такимexists a. Show a => a
, но Haskell не поддерживает такого рода экзистенциальное количественное определение.Обновление: как указывает chi в комментарии , это также было бы возможно, если бы Haskell имел поддержку типов объединения / пересечения (которые не совпадают с типами sum / product), но, к сожалению, этого не происходит.
источник
Int ∪ Double
, то вы бы знали, что у вас есть один из двух, но не смогли бы сопоставить с шаблоном, чтобы увидеть, какой, поэтому вы могли бы делать только то, что было бы допустимо для обеих возможностей.typeof
оператор, который может восполнить отсутствие тегов и посмотреть, какой тип используется в любом случае. Haskell полностью стерт, поэтому если он поддерживает эту функцию, то не будет никакого эквивалента этому.Существуют типы продуктов с упрощенным синтаксисом, написанные
(,)
на Haskell. Можно было бы подумать, что тип суммы с легким синтаксисом, что-то вроде(Int | String)
, будет отличной идеей. Реальность сложнее. Давайте посмотрим, почему (я принимаю некоторые вольностиNum
, они не важны).Если это должно вернуть значение типа like
(Int | String)
, то что должно возвращать следующее?(Int | Int)
очевидно, но если это отличается от простого,Int
то у нас большие проблемы. Так(Int | Int)
должно быть идентично равнинеInt
.Сразу видно, что это не просто упрощенный синтаксис для типов сумм, а совершенно новая языковая функция. Другой тип системы типов, если хотите. Должны ли мы иметь один?
Давайте посмотрим на эту функцию.
Теперь какой тип
mysteryType
имеет? очевидноправильно? Что теперь, если
a
иb
того же типа?Это должно быть ясно,
Int
как мы договорились ранее. ТеперьmysteryType
иногда возвращают анонимный тип суммы, а иногда нет, в зависимости от того, какие аргументы вы передаете. Как бы вы сопоставили шаблон с таким выражением? Что на земле вы можете сделать с этим? За исключением тривиальных вещей, таких как «show» (или любых других методов классов типов, которые он будет использовать), не так уж много. Если вы не добавите информацию о типе времени выполнения к языку, то есть онtypeof
будет доступен - и это делает Haskell совершенно другим языком.Так что да. Почему Haskell не является TypeScript? Потому что нам не нужен другой TypeScript. Если вы хотите TypeScript, вы знаете, где его найти.
источник