Я собираюсь преподавать курс более низкого уровня в дискретных структурах. Я выбрал текстовую книгу Discrete Structures, Logic и Computability частично потому, что в ней содержатся примеры и концепции, способствующие реализации с функциональным программированием язык. (Я также считаю это хорошим учебником.)
Я хочу простой для понимания язык FP, чтобы проиллюстрировать концепции DS и что студенты могут использовать. В лучшем случае у большинства студентов будет только один или два семестра программирования на Java. Посмотрев на Схему, Erlang, Haskell, Ocaml и SML, я поселился в Haskell или Standard ML. Я склоняюсь к Haskell по причинам, изложенным ниже, но мне хотелось бы мнение тех, кто является активным программистом в том или ином.
- Оба Haskell и SML имеют сопоставление с образцом, что позволяет описать рекурсивный алгоритм cinch.
- Haskell имеет приятные списки, которые хорошо сочетаются с тем, как эти списки выражаются математически.
- У Haskell есть ленивая оценка. Отлично подходит для построения бесконечных списков, используя технику понимания списка.
- SML имеет действительно интерактивный интерпретатор, в котором функции могут быть определены и использованы. В Haskell функции должны быть определены в отдельном файле и скомпилированы перед использованием в интерактивной оболочке.
- SML дает явное подтверждение аргументов функции и возвращаемых типов в синтаксисе, который легко понять. Например: val foo = fn: int * int → int. Синтаксис неявного каркаса Haskell немного тупые, но не совсем чужды. Например: foo:: Int → Int → Int.
- Haskell по умолчанию использует произвольные числа точности. Это внешняя библиотека в SML/NJ. И SML/NJ усекает вывод по 70 символов по умолчанию.
- Синтаксис лямбда Haskell тонкий - он использует один обратный слэш. SML является более явным. Не уверен, что нам когда-нибудь понадобится лямбда в этом классе.
По существу, SML и Haskell примерно эквивалентны. Я склоняюсь к Haskell, потому что я люблю списки и бесконечные списки в Haskell. Но я обеспокоен тем, что обширное количество символов в компактном синтаксисе Haskell может вызвать проблемы со студентами. Из того, что я собрал, читал другие сообщения на SO, Haskell не рекомендуется начинающим начинающим с FP. Но мы не собираемся создавать полноценные приложения, просто пытаемся простыми алгоритмами.
Как вы думаете?
Изменить: прочитав некоторые из ваших замечательных ответов, я должен уточнить некоторые из моих пунктов.
В SML нет синтаксического различия между определением функции в интерпретаторе и ее определением во внешнем файле. Скажем, вы хотите написать факториальную функцию. В Haskell вы можете поместить это определение в файл и загрузить его в GHCi:
fac 0 = 1
fac n = n * fac (n-1)
Для меня это ясно, красно и соответствует математическому определению в книге. Но если вы хотите напрямую написать функцию в GHCi, вам нужно использовать другой синтаксис:
let fac 0 = 1; fac n = n * fac (n-1)
При работе с интерактивными переводчиками с точки зрения обучения это очень удобно, когда ученик может использовать один и тот же код как в файле, так и в командной строке.
Под "явным подтверждением функции" я имел в виду, что после определения функции SML сразу сообщает вам имя функции, типы аргументов и тип возвращаемого значения. В Haskell вам нужно использовать команду :type
, а затем вы получите несколько запутанную нотацию карри.
Еще одна интересная вещь о Haskell - это правильное определение функции:
fac 0 = 1
fac (n+1) = (n+1) * fac n
Опять же, это соответствует определению, которое они могут найти в учебнике. Невозможно сделать это в SML!