Dlaczego nie są równoważne?
show $ if someCondition then someInt else some double
i
if someCondition then show someInt else show someDouble
Rozumiem, że jeśli wyodrębnisz if ... else
część w pierwszym przykładzie do wyrażenia samodzielnie, nie będziesz mógł reprezentować jego typu za pomocą anonimowego typu sumy, takiego Int | Double
jak coś, co można łatwo zrobić w TypeScript (wspominając o TypeScript, ponieważ jest to langauge, którego często używałem i który obsługuje typy Sum), i musiałbym skorzystać z Either
danych, a następnie na podstawie tego zadzwonić show
.
Podany przeze mnie przykład jest trywialny, ale dla mnie bardziej sensowne jest myślenie „OK, pokażemy coś i że coś zależy od someCondition
”, a nie „OK, jeśli jakiś warunek jest prawdziwy, to pokaż niektóre, w przeciwnym razie pokaż jakieś double”, a także pozwala dla mniejszego duplikowania kodu (tutaj pokaz powtarza się dwa razy, ale może to być również długa aplikacja funkcji i zamiast if ... else
niej można rozważyć> 2 gałęzie)
Moim zdaniem kompilator powinien łatwo sprawdzić, czy każdy z typów tworzących typ sumy (tutaj Int | Double
) może być użyty jako parametr do show
działania i decyduje, czy typy są poprawne, czy nie. Jeszcze lepsze jest to, że show
funkcja zawsze zwraca string
bez względu na typy parametrów, więc kompilator nie musi nosić ze sobą wszystkich możliwych „gałęzi” (czyli wszystkich możliwych typów).
Czy z wyboru taka funkcja nie istnieje? Czy może wdrażanie jest trudniejsze niż myślę?
making all conversions explicit
. Na moje pytanie, nie chcę Haskell rzutować Int
Do Double
lub vice versa. Właśnie użyłem tych dwóch typów jako przykładu. Można zastąpić każdy Int
z a
a Double
z b
moim pytaniem, gdzie oba typy wywodzą Show
. Rozumiem, że nie ma go anonymous sum types
w Haskell, ale chciałbym wiedzieć, dlaczego tak jest i co powstrzymuje nas od zaprojektowania języka, aby go mieć.
x :: Int | Bool
i musimy skompilować show x
, nie ma łatwego sposobu, aby dowiedzieć się, którego wskaźnika użyć do wywołania show
, w RTS opartym na usuwaniu typów. Prawdopodobnie musielibyśmy zachować pewne informacje na poziomie typu w czasie wykonywania.
(String, Int)
nie jest anonimowy. Jest to zwykły typ produktu ze śmieszną składnią. (String | Int)
byłoby zupełnie inaczej. Zacznij od pytania, czy (Int|Int)
powinno być identyczne Int
i dlaczego.
if ... then ... else ...
musi mieć ten sam typ w częścithen
ielse
. W niektórych językach programowania można go postrzegać jako operator trójskładnikowy.