Почему они не эквивалентны?
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
значения независимо от типов параметров, поэтому компилятору не нужно переносить все возможные «ветви» (то есть все возможные типы).
Это по выбору, что такая функция не существует? Или, как мне кажется, реализовать это сложнее?
making all conversions explicit
. В моем вопросе я не хочу, чтобы Haskell использовал Int
a Double
или наоборот. Я просто использовал эти два типа в качестве примера. Вы могли бы заменить каждый Int
с a
и Double
с b
в моем вопросе , где оба типа наследуют Show
. Я понимаю, что anonymous sum types
в Haskell их нет, но я хотел бы знать, почему это так и что мешает нам разработать язык для его использования.
x :: Int | Bool
и нам нужно скомпилировать show x
, нет простого способа узнать, какой указатель на функцию использовать для вызова show
, в RTS на основе стирания типа. Мы, вероятно, должны были бы хранить некоторую информацию уровня типа во время выполнения.
(String, Int)
не является анонимным Это обычный продукт с забавным синтаксисом. (String | Int)
было бы совсем по-другому. Начните с вопроса о том, (Int|Int)
должен ли он быть идентичным Int
и почему.
if ... then ... else ...
, должен иметь тот же тип вthen
иelse
части. Вы можете видеть это как троичный оператор в некоторых языках программирования.