Zdaję sobie sprawę, że niektóre rzeczy są łatwiejsze / trudniejsze w jednym języku niż w drugim, ale interesują mnie tylko funkcje związane z typem, które są możliwe w jednym, a niemożliwe / nieistotne w drugim. Mówiąc dokładniej, zignorujmy rozszerzenia typu Haskell, ponieważ jest ich tak wiele, że robią różne szalone / fajne rzeczy.
java
haskell
type-systems
static-typing
GlenPeterson
źródło
źródło
Odpowiedzi:
(„Java”, w znaczeniu stosowanym w niniejszym dokumencie, jest zdefiniowane jako standardowy Java SE 7 ; „Haskell”, w znaczeniu stosowanym w niniejszym dokumencie, jest zdefiniowany jako standardowy Haskell 2010 ).
Rzeczy, które ma system typów Java, ale Haskell nie:
Rzeczy, które ma system typów Haskella, ale Java nie:
EDYTOWAĆ:
Przykłady każdego z powyższych punktów:
Unikalny dla Java (w porównaniu do Haskell)
Nominalny polimorfizm podtypu
Informacje o częściowym typie środowiska wykonawczego
Unikalny dla Haskell (w porównaniu z Javą)
Ograniczony polimorfizm ad-hoc
Polimorfizm podtypu „oparty na ograniczeniach” (oparty na ograniczonym polimorfizmie ad-hoc)
Lepszy parametryczny polimorfizm
Główne pisanie
Trudno podać bezpośredni przykład tego, ale oznacza to, że każde wyrażenie ma dokładnie jeden maksymalnie ogólny typ (zwany jego głównym rodzajem ), który jest uważany za kanoniczny typ tego wyrażenia. W kategoriach polimorfizmu podtypu „opartego na ograniczeniach” (patrz wyżej), głównym typem wyrażenia jest unikalny podtyp każdego możliwego typu, którego można użyć tego wyrażenia. Obecność podstawowego pisania w (nie rozwiniętym) języku Haskell pozwala na pełne wnioskowanie o typie (czyli pomyślne wnioskowanie o typie dla każdego wyrażenia, bez potrzeby adnotacji typu). Rozszerzenia, które łamią podstawowe typowanie (których jest wiele), również łamią kompletność wnioskowania o typie.
źródło
l
jako zmiennej jednuliterowej, bardzo BARDZO trudno ją odróżnić1
!Typeable
, ale Haskell 2010 go nie ma (może Haskell 2014 to zrobi?).W systemie typu Java brakuje polimorfizmu wyższego rzędu; System typów Haskell ma to.
Innymi słowy: w Javie konstruktory typów mogą abstrakcyjnie konstruować typy, ale nie konstruktory typów, podczas gdy w Haskell konstruktory typów mogą konstruować typy i konstruktory typów.
W języku angielskim: w Javie rodzajowy nie może przyjąć innego typu ogólnego i sparametryzować go,
będąc w Haskell jest to dość łatwe
źródło
<T<_> extends Collection> T<Integer> convertStringsToInts(T<string> strings)
. Chodzi o to, że jeśli ktośconvertStringsToInts<ArrayList>
nazwałby to tak, jak gdyby wziął tablicę ciągów znaków i zwrócił tablicę liczb całkowitych. A gdyby zamiast tego użyliconvertStringsToInts<LinkedList>
, to byłoby to samo z połączonymi listami.forall
swoje typy. W Haskell typa -> b
jest niejawnyforall a. forall b. a -> b
. Dzięki rozszerzeniu możeszforall
jawnie je przesuwać i przenosić.Aby uzupełnić inne odpowiedzi, system typów Haskell nie ma podtytułów , podczas gdy pisane są zorientowane obiektowo języki jak Java.
źródło
Jedną rzeczą, o której nikt dotąd nie wspominał, jest wnioskowanie o typie: kompilator Haskell zazwyczaj może wnioskować o typie wyrażeń, ale musisz szczegółowo powiedzieć kompilatorowi Java. Ściśle rzecz biorąc, jest to cecha kompilatora, ale konstrukcja języka i systemu typów określa, czy wnioskowanie typu jest możliwe. W szczególności wnioskowanie typu źle współdziała z polimorfizmem podtypu Java i przeciążeniem ad hoc. Natomiast projektanci Haskell starają się nie wprowadzać funkcji, które wpływają na wnioskowanie o typie.
Inną rzeczą, o której ludzie dotychczas nie wspominali, są algebraiczne typy danych. Oznacza to zdolność do konstruowania typów z sum („lub”) oraz produktów („i”) innych typów. Klasy Java wykonują produkty (powiedzmy pole A i pole B). Ale tak naprawdę nie robią sum (powiedzmy pole A LUB pole b). Scala musi zakodować to jako wiele klas spraw, co nie jest dokładnie takie samo. I choć działa dla Scali, to trochę trudno powiedzieć, że Java ma.
Haskell może także konstruować typy funkcji za pomocą konstruktora funkcji, ->. Chociaż metody Java mają podpisy typów, nie można ich łączyć.
System typów Java umożliwia modułowość, której Haskell nie ma. Upłynie trochę czasu, zanim pojawi się OSGi dla Haskella.
źródło