Я сказал бы Полосу приветы из списка тогда разделенный пространством, поместив list.first () как имя, list.last (), поскольку фамилия тогда присоединяется к остатку пространством и имеет это как второе имя. И, ПРЕЖДЕ ВСЕГО, отобразите свои результаты и позвольте пользователю изменить их!
Scala Программисту на Haskell:
Scala - это строгий и нечистый язык с первоклассными модулями. Типы данных объявлены как «классы» или «признаки» с небольшими различиями, а модули или «объекты» являются значениями этих типов. Scala поддерживает конструкторы типов, принимающие универсальные количественные параметры типа. Объекты / классы / характеристики имеют члены, которые состоят из значений, изменяемых переменных и функций (называемых «методами», которым модуль неявно передается как переменная с именем this
). Модули могут иметь члены типа, которые также могут принимать параметры. Члены типа имеют экзистенциальную количественную оценку, а параметры типа могут быть более высокого порядка. Поскольку типы могут быть членами значений первого класса, Scala предоставляет разновидность зависимой типизации, называемую зависимыми от пути типами .
Первоклассные функции также являются модулями. Функция - это модуль с методом под названием apply
. Метод не является первоклассным, но предоставляется синтаксис для обертывания метода в первоклассную функцию. К сожалению, для модуля требуются все параметры типа заранее, поэтому частично применяемая функция первого класса не может быть универсально определена количественно. В более общем плане, в Scala полностью отсутствует прямой механизм для типов с рангом выше 1, но модули, параметризованные на более высокодородных типах, можно использовать для имитации типов с рангом n.
Вместо классов типов с глобальной областью видимости Scala позволяет объявлять неявное значение любого данного типа. Сюда входят типы функций, которые обеспечивают неявное преобразование и, следовательно, расширение типа. В дополнение к неявным преобразованиям, расширение типа обеспечивается расширением механизм, который позволяет вам объявлять отношение подтипа / супертипа между модулями. Этот механизм можно использовать для имитации алгебраических типов данных, где супертип можно рассматривать как тип в левой части объявления данных, а его подтипы как конструкторы значений в правой части. Scala имеет обширные возможности сопоставления с образцом с использованием виртуализированного сопоставителя с образцами первого класса.
Scala поддерживает подтипы, и это значительно ограничивает вывод типов. Но вывод типов со временем улучшился. Поддерживается вывод более высокородных типов. Однако в Scala отсутствует какая-либо значимая система типов, и, следовательно, нет доброго вывода и никакой доброй унификации. Если вводится переменная типа, она имеет вид *
, если не указано иное. Некоторые типы, такие как Any
(супертип всех типов) и Nothing
(подтип каждого типа), технически относятся к каждому виду , хотя их нельзя применить к типу аргументы.
Haskell программисту на Scala:
Haskell - чисто функциональный язык. Это означает, что функциям вообще не разрешается иметь какие-либо побочные эффекты. Например, программа Haskell не выводит на экран как таковую, а представляет собой функцию, которая возвращает значение типа данных IO [_]
, которое описывает последовательность действий, которые должна выполнять подсистема ввода-вывода.
В то время как Scala по умолчанию является строгим и предоставляет аннотацию «по имени» для нестрогих аргументов функции, Haskell по умолчанию ленив, используя семантику «по необходимости» и предоставляет аннотацию для строгих аргументов.
Вывод типа в Haskell более полный, чем в Scala, и имеет полный вывод. Это означает, что аннотация типов почти никогда не нужна.
Недавние расширения компилятора GHC позволяют использовать расширенные функции системы типов, не имеющие эквивалента в Scala, такие как типы ранга n, семейства типов и полиморфизм видов.
В Haskell , модуль - это набор типов и функций, но модули не являются первоклассными объектами. Имплициты предоставляются классами типов, но после объявления они имеют глобальную область видимости, и их нельзя передать явно, как в Scala. Множественные экземпляры класса типа для данного типа разрешаются путем обертывания с newtype
для устранения неоднозначности, тогда как в Scala эта проблема решается просто путем определения области видимости или явной передачи экземпляров.
Поскольку Haskell не является "объектно-ориентированный", там ' s нет дихотомии метода / функции. Каждая функция является первоклассной, и каждая функция каррирована по умолчанию (без Function1, Function2 и т. Д.).
Haskell не имеет механизма подтипов, но классы типов могут иметь отношения подклассов.
Я не верю, что кто-то систематически сравнивал Haskell (на примере системы типов GHC) со Scalas. Основное отличие - это степень вывода типов и поддержка типов более высокого ранга. Но полное рассмотрение различий будет опубликовано.