Вопрос

Я прочитал, что система типа Скалы ослаблена взаимодействием Java и поэтому не может выполнять некоторые из тех же полномочий, что и система типа Haskell. Это правда? Это слабость из-за типа стирания, или я ошибаюсь во всех отношениях? Это разница причина того, что Scala не имеет типовых опор?

Это было полезно?

Решение

Большая разница состоит в том, что Scala не имеет вывода глобального типа Hindley-Miller и вместо этого использует форму локального вывода типа, требуя вас указывать типы для параметров метода и тип возврата для перегруженных или рекурсивных функций.

Это не приводится в движение типовым стиранием или другими требованиями JVM. Все возможные трудности здесь могут быть преодолены, и были, просто рассмотрите Jaskell - http://docs.codehaus.org/display/jaskell/home.

HM Вывод не работает в объектно-ориентированном контексте. В частности, когда используется тип-полиморфизм (в отличие от специального полиморфизма типовых классов). Это имеет решающее значение для сильного взаимодействия с другими библиотеками Java и (в меньшей степени), чтобы получить наилучшую возможную оптимизацию от JVM.

Не очень действует, чтобы указать, что либо Haskell или Scala имеет более сильную систему типа, только что они отличаются. Оба языка нажимают границы программирования на основе типа в разных направлениях, и каждый язык имеет уникальные сильные стороны, которые трудно дублировать в другом.

Другие советы

Система типа Scala отличается от Haskell's, хотя концепции Скалы иногда непосредственно вдохновляются сильными сторонами Haskell и его знающим сообществом исследователей и профессионалов.

Конечно, работает на VM, не предназначенном для функционального программирования в первую очередь, создает некоторые проблемы совместимости с существующими языками, ориентированными на эту платформу. Поскольку большинство рассуждений о типах происходит во время компиляции, ограничения Java (в качестве языка и платформы) во время выполнения нечего беспокоиться (кроме типа стирания, хотя именно эта ошибка, кажется, делает интеграцию в Java экосистема более бесшовные).

Насколько я знаю, единственный «компромисс» на уровне типа типа с Java является специальным синтаксисом для обработки сырьевых типов. В то время как SCALA даже не позволяет больше не допускать сырьевых типов, он принимает старые файлы классов Java с этой ошибкой. Может быть, вы видели код как List[_] (или более длительный эквивалент List[T] forSome { type T }). Это функция совместимости с Java, но также рассматривается как экзистенциальный тип внутри и не ослабляет систему типа.

Система типа Scala поддерживает Тип классов, хотя в более просторном пути, чем haskell. Я предлагаю прочитать эту статью, что может создать различное впечатление на относительную прочность системы Scala System (таблица на странице 17 служит приятным списком очень мощных концепций системы типа).

Не обязательно связано с мощностью типа системы, является подход к компиляторам Scala и Haskell для вывода типов, хотя оно оказывает некоторое влияние на то, как люди пишут код. Наличие мощного алгоритма вывод типа может сделать его стоящим, чтобы написать более абстрактный код (вы можете решить сами, если это хорошая вещь во всех случаях).

В конце типа Scala и типа Haskell управляются желанием предоставить своим пользователям лучших инструментов для решения своих проблем, но и понадобились разные пути к этой цели.

Еще одним интересным точком считает, что SCALA напрямую поддерживает классический OO-стиль. Что означает, что есть подтип Отношения (например, список - это подкласс SEQ). И это делает вывод типа более сложный. Добавьте к этому тот факт, что вы можете смешивать в чертах в Scala, что означает, что данный тип может иметь несколько отношений Supertype (что делает его более сложным)

Scala не имеет типы ранга, хотя может быть возможно работать вокруг этого ограничения в определенных случаях.

У меня мало опыта с Haskell, но наиболее очевидная вещь, которую я отмечаю, что система Scala Type отличается от Haskell, это вывод типа.

В Scala нет локального вывода типа, вы должны четко сказать типу аргументов функций.

Например, в Scala вам нужно написать это:

def add (x: Int, y: Int) = x + y

вместо

add x y = x + y

Это может вызвать проблему, когда вам нужна универсальная версия функции Add, которая работает со всеми видами типа, имеет метод «+». Для этого есть обходной путь, но он получит более многословную.

Но в реальном использовании я нашел систему типа Scala, достаточно мощной для ежедневного использования, и я почти никогда не использую эти обходные пути для обзора, может быть, это потому, что я поступаю из Java World.

И ограничение явного объявления Тип аргументов не нужен плохой вещь, вам все равно нужен документ.

Ну, они помогают сводимыми?

Смотрите страницу Олега Киселез http://okmij.org/ftp/... Можно реализовать исчисление лямбда в системе типа Haskell. Если Scala может сделать это, то в смысле типа системы Haskell System и Scala System вычисляют одни и те же типы. Вопросы: насколько естественно друг с другом? Как элегантно один над другим?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top