Чому вони не є рівнозначними?
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 віддавав 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
. Ви можете бачити це як потрійний оператор у деяких мовах програмування.