Чому вони не є рівнозначними?
show $ if someCondition then someInt else some double
і
if someCondition then show someInt else show someDouble
Я розумію, що якщо ви виділите if ... elseчастину в першому прикладі до виразу самостійно, то ви не можете представляти його тип анонімним типом суми, таким Int | Double, як щось, що ви могли б легко зробити в TypeScript (згадуючи TypeScript, тому що це Я використовував часто та підтримує типи сум), і мені доведеться вдаватися до використання Eitherданих, які тоді базуються на ньому show.
Приклад, який я наводив тут, є тривіальним, але для мене є більше сенсу думати "Гаразд, ми збираємось щось показати, і від цього щось залежить someCondition", а не "Добре, якщо деяка умова справжня, то покажіть інше, якщо в іншому випадку покажіть дещо подвійне", а також дозволяє для меншого дублювання коду (тут показ повторюється двічі, але це також може бути додатково функціональне додаток, а замість if ... elseцього може бути> 2 гілки для розгляду)
На мій погляд, компілятору слід легко перевірити, чи може кожен із типів, що утворюють тип суми (тут Int | Double), використовуватися як параметр для showфункціонування, і вирішує, чи типи правильні чи ні. Ще краще те, що showфункція завжди повертає stringнезалежно від типів параметрів, тому компілятору не доведеться мати з собою всі можливі "гілки" (тому всі можливі типи).
Чи за вибором така функція не існує? Або реалізувати це важче, як я думаю?
making all conversions explicit. Що стосується мого запитання, я не хочу, щоб Haskell віддавав Inta 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. Ви можете бачити це як потрійний оператор у деяких мовах програмування.