Я понимаю, что некоторые вещи проще / сложнее в одном языке, чем в другом, но меня интересуют только функции, связанные с типами, которые возможны в одном и невозможны / неактуальны в другом. Чтобы сделать его более конкретным, давайте проигнорируем расширения типов на Haskell, поскольку их так много, которые делают разные сумасшедшие / крутые вещи.
java
haskell
type-systems
static-typing
GlenPeterson
источник
источник
Ответы:
(«Java», как здесь используется, определяется как стандарт Java SE 7 ; «Haskell», как здесь используется, определяется как стандарт Haskell 2010 ).
Вещи, которые есть в системе типов Java, но нет в Haskell:
Вещи, которые есть в системе типов Haskell, а в Java - нет:
РЕДАКТИРОВАТЬ:
Примеры каждого из пунктов, перечисленных выше:
Уникально для Java (по сравнению с Haskell)
Номинальный подтип полиморфизма
Частичная информация о типе среды выполнения
Уникально для Haskell (по сравнению с Java)
Ограниченный специальный полиморфизм
«Основанный на ограничениях» полиморфизм подтипа (основанный на ограниченном специальном полиморфизме)
Высоко-родственный параметрический полиморфизм
Основной тип
Этот пример трудно привести к прямому примеру, но это означает, что каждое выражение имеет ровно один максимально общий тип (называемый его основным типом ), который считается каноническим типом этого выражения. В терминах «основанного на ограничениях» полиморфизма подтипа (см. Выше) основным типом выражения является уникальный подтип каждого возможного типа, в котором это выражение может использоваться. Наличие основной типизации в (нерасширенном) Haskell - это то, что допускает полный вывод типов (то есть успешный вывод типов для каждого выражения, без необходимости каких-либо аннотаций типов). Расширения, которые нарушают основную типизацию (которых много) также нарушают полноту вывода типов.
источник
l
качестве одной переменной буквы, это очень трудно отличить от1
!Typeable
, но у Haskell 2010 его нет (может, у Haskell 2014 будет?).В системе типов Java отсутствует более высокий родовой полиморфизм; Система типов Хаскелла имеет это.
Другими словами: в Java конструкторы типов могут абстрагироваться от типов, но не от конструкторов типов, тогда как в Haskell конструкторы типов могут абстрагироваться как от конструкторов типов, так и от типов.
На английском языке: в Java универсальный тип не может принимать другой универсальный тип и параметризировать его,
в то время как в Haskell это довольно легко
источник
<T<_> extends Collection> T<Integer> convertStringsToInts(T<string> strings)
. Идея заключается в том, что если бы кто-то назвал его так, какconvertStringsToInts<ArrayList>
он бы взял массив строк и вернул список целых чисел. И если бы они вместо этого использовалиconvertStringsToInts<LinkedList>
, то было бы то же самое со связанными списками вместо этого.forall
в своих типах. В Haskell типa -> b
является неявнымforall a. forall b. a -> b
. С помощью расширения вы можете сделать этоforall
явным образом и перемещать их.Чтобы дополнить другие ответы, система типов Haskell не имеет подтипов , в то время как типизированные объектно-ориентированные языки, как в Java, имеют.
источник
До сих пор никто не упомянул о выводе типов: компилятор Haskell обычно может определить тип выражений, но вы должны подробно сообщить компилятору Java о ваших типах. Строго говоря, это особенность компилятора, но дизайн языка и системы типов определяет, возможен ли вывод типа. В частности, вывод типов плохо взаимодействует с полиморфизмом подтипов Java и специальной перегрузкой. Напротив, дизайнеры Haskell стараются не вводить функции, которые влияют на вывод типа.
Еще одна вещь, о которой люди до сих пор не упоминали, - это алгебраические типы данных. То есть способность создавать типы из сумм ('или') и продуктов ('и') других типов. Классы Java делают продукты (скажем, поле a и поле b) хорошими. Но они на самом деле не делают суммы (например, укажите поле ИЛИ b). Scala должен закодировать это как несколько классов case, что не совсем одно и то же. И хотя это работает для Scala, довольно сложно сказать, что в Java это есть.
Haskell также может создавать типы функций, используя конструктор функций, ->. Хотя методы Java имеют сигнатуры типов, вы не можете их комбинировать.
Система типов Java позволяет использовать тип модульности , которого у Haskell нет. Пройдет некоторое время, прежде чем появится OSGi для Haskell.
источник