Haskell или Standard ML для начинающих? [закрыто]

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

Мне нужен простой для понимания язык FP, чтобы проиллюстрировать концепции DS и которые студенты могут использовать. В лучшем случае у большинства студентов будет только один или два семестра программирования на Java. Посмотрев на Scheme, Erlang, Haskell, Ocaml и SML, я остановился на Haskell или Standard ML. Я склоняюсь к Haskell по причинам, изложенным ниже, но мне бы хотелось узнать мнение тех, кто является активным программистом в том или ином.

  • У Haskell и SML есть сопоставление с образцом, что делает описание рекурсивного алгоритма легким делом.
  • У Haskell есть отличные понимания списков, которые хорошо соответствуют тому, как такие списки выражаются математически.
  • У Haskell ленивая оценка. Отлично подходит для построения бесконечных списков с использованием техники понимания списков.
  • SML имеет действительно интерактивный интерпретатор, в котором функции могут быть определены и использованы. В Haskell функции должны быть определены в отдельном файле и скомпилированы перед использованием в интерактивной оболочке.
  • SML дает явное подтверждение аргумента функции и возвращаемых типов в синтаксисе, который легко понять. Например: val foo = fn: int * int -> внутр. Неявный синтаксис карри в Haskell немного более тупой, но не совсем чуждый. Например: foo :: Int -> Int -> Int.
  • Haskell по умолчанию использует целые числа произвольной точности. Это внешняя библиотека в SML /NJ. А SML /NJ усекает вывод до 70 символов по умолчанию.
  • Лямбда-синтаксис в Haskell неуловим - он использует одну обратную косую черту. SML более явный. Не уверен, что нам когда-нибудь понадобится лямбда в этом классе.

По сути, SML и 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!

73 голоса | спросил Barry Brown 1 Mayam09 2009, 10:31:16

8 ответов


0

Как бы я ни любил Haskell, вот причины, по которым я бы предпочел SML для класса с дискретной математикой и структурами данных (и у большинства других начинающих классов):

  • Затраты времени и места на программы на Haskell могут быть очень сложными, даже для экспертов. SML предлагает гораздо более ограниченные способы выдувания машины.

  • Синтаксис определения функции в интерактивном интерпретаторе идентичен синтаксису, используемому в файле, поэтому вы можете вырезать и вставлять.

  • Несмотря на то, что перегрузка операторов в SML полностью ложная, она также проста. Будет сложно преподавать целый класс в Хаскеле, не посещая классы типов.

  • Ученик может отлаживать, используя print. (Хотя, как указывает комментатор, в Haskell можно получить почти тот же эффект, используя Debug.Trace.trace.)

  • Бесконечные структуры данных поражают воображение людей. Для новичков лучше, чтобы они определили тип потока с ячейками ref и thunks, чтобы они знали, как это работает:

    datatype 'a thunk_contents = UNEVALUATED of unit -> 'a
                               | VALUE of 'a
    type 'a thunk = 'a thunk_contents ref
    val delay : (unit -> 'a) -> 'a thunk
    val force : 'a thunk -> 'a
    

    Теперь это больше не волшебство, и вы можете перейти к потокам (бесконечным спискам).

  • Макет не так прост, как в Python, и может сбивать с толку.

У Haskell есть два преимущества:

  • В ядре Haskell вы можете написать сигнатуру типа функции непосредственно перед ее определением. Это очень полезно для студентов и других начинающих. Просто нет хорошего способа иметь дело с сигнатурами типов в SML.

  • Haskell имеет лучший конкретный синтаксис. Синтаксис Haskell - это значительное улучшение по сравнению с синтаксисом ML. Я написал короткую заметку о том, когда использовать скобки в ML программа ; это немного помогает.

Наконец, есть меч, который режет в обе стороны:

  • Код на Haskell по умолчанию чистый, поэтому ваши ученики не могут случайно наткнуться на нечистые конструкции (монада ввода-вывода, монада состояния). Но, к тому же, они не могут печатать, и если вы хотите сделать ввод /вывод, то как минимум вы должны объяснить do нотации, а return сбивает с толку.

По связанной теме вот несколько советов по подготовке к курсу: не забывайте, что чисто функциональный Структуры данных Криса Окасаки. Даже если ваши ученики не пользуются им, вам обязательно понадобится копия.

ответил Norman Ramsey 2 Mayam09 2009, 02:59:49
0

Мы учим Хаскелла первым годам в нашем университете. Мои чувства по этому поводу немного смешанные. С одной стороны, преподавание Haskell первым годам означает, что им не нужно разучивать императивный стиль. Haskell также может создавать очень лаконичный код, который могут оценить люди, ранее имевшие Java.

Некоторые проблемы, с которыми я часто сталкиваюсь у студентов:

  • Сопоставление с образцом поначалу может быть немного сложным. Изначально у студентов возникли проблемы с пониманием взаимосвязи между построением стоимости и сопоставлением с образцом. У них также были некоторые проблемы, различающие абстракции. Наши упражнения включали в себя написание функций, которые упрощают арифметическое выражение, и некоторым студентам было трудно увидеть разницу между абстрактным представлением (например, Const 1) и мета -языковое представление (1).

    Кроме того, если ваши студенты должны сами писать функции обработки списков, будьте осторожны, указывая на разницу между шаблонами

    []
    [x]
    (x:xs)
    [x:xs]
    

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

  • Мы не учили наших студентов анонимным функциям, мы просто рассказывали им о предложениях where. Для некоторых задач это было немного многословно, но в остальном работало хорошо. Мы также не сказали им о частичных заявлениях; это, вероятно, довольно легко объяснить в Haskell (из-за его формы написания), поэтому, возможно, им стоит показать их.

  • Они быстро обнаружили списки и предпочли их функциям более высокого порядка, таким как filter, map, zipWith.

  • Я думаю, что мы немного упустили учить их, как позволить им направлять свои мысли по типам. Однако я не совсем уверен, полезно ли это новичкам или нет.

  • Сообщения об ошибках обычно не очень полезны для новичков, им иногда может понадобиться некоторая помощь с ними. Я сам не пробовал, но есть компилятор Haskell, специально предназначенный для новичков, в основном посредством улучшенных сообщений об ошибках: Гелий

  • Для небольших программ такие вещи, как возможные утечки места, не были проблемой.

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

ответил nominolo 1 Maypm09 2009, 17:11:49
0

Кстати,

  

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

Неточно. Использовать GHCi:

Prelude> let f x = x ^ 2
Prelude> f 7
49
Prelude> f 2
4

На Haskell.org также есть хорошие ресурсы для Хаскелла в сфере образования. страница, с опытом разных учителей. http://haskell.org/haskellwiki/Haskell_in_education

Наконец, вы сможете научить их многоядерному параллелизму просто для удовольствия, если будете использовать Haskell: -)

ответил Don Stewart 1 Maypm09 2009, 18:54:52
0

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

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

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

ответил Ganesh Sittampalam 1 Mayam09 2009, 11:14:38
0
  
  • SML имеет действительно интерактивный интерпретатор, в котором функции могут быть определены и использованы. В Haskell функции должны быть определены в отдельном файле и скомпилированы перед использованием в интерактивной оболочке.
  •   

Хотя у Hugs может быть такое ограничение, GHCi этого не делает:

$ ghci
GHCi, version 6.10.1: http://www.haskell.org/ghc/  :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer ... linking ... done.
Loading package base ... linking ... done.
Prelude> let hello name = "Hello, " ++ name
Prelude> hello "Barry"
"Hello, Barry"

Есть много причин, по которым я предпочитаю GHC (i), а не Hugs, это только одна из них.

  
  • SML дает явное подтверждение аргумента функции и возвращаемых типов в синтаксисе, который легко понять. Например: val foo = fn: int * int -> внутр. Неявный синтаксис карри в Haskell немного более тупой, но не совсем чуждый. Например: foo :: Int -> Int -> Int.
  •   

SML также имеет то, что вы называете синтаксисом «неявного карри».

$ sml
Standard ML of New Jersey v110.69 [built: Fri Mar 13 16:02:47 2009]
- fun add x y = x + y;
val add = fn : int -> int -> int
  

По сути, SML и Haskell примерно эквивалентны. Я склоняюсь к Хаскеллу, потому что мне нравятся списочные и бесконечные списки в Хаскеле. Но я обеспокоен тем, что большое количество символов в компактном синтаксисе Haskell может вызвать проблемы у студентов. Из того, что я почерпнул, читая другие посты на SO, Haskell не рекомендуется для начинающих, начинающих с FP. Но мы не собираемся создавать полноценные приложения, а просто пробуем простые алгоритмы.

Мне нравится использовать Haskell гораздо больше, чем SML, но я все равно сначала научу SML.

  • Отделяя мысли номиноло, понимание списков do , кажется, замедляет учеников к выполнению некоторых функций более высокого порядка.
  • Если вам нужны лень и бесконечные списки, полезно поучаствовать в этом явно.
  • Поскольку SML оценивается с энтузиазмом, модель выполнения гораздо проще понять, и «отладка с помощью printf» работает намного лучше, чем в Haskell.
  • Система типов SML также проще. Хотя ваш класс, вероятно, не будет использовать их в любом случае, классы типов Haskell по-прежнему являются дополнительным ударом, позволяющим им понять 'a и ''a различия в SML достаточно жесткие.
ответил ephemient 1 Maypm09 2009, 19:08:48
0

Большинство ответов были техническими, но я думаю, что вы должны рассмотреть, по крайней мере, один из них: Haskell (как OCaml) в настоящее время имеет большее сообщество, использующее его в более широком диапазоне контекстов. Существует также большая база данных библиотек и приложений, написанных для получения прибыли и развлечений на Hackage . Это может быть важным фактором для того, чтобы некоторые из ваших студентов использовали язык после окончания курса, и, возможно, позже попробуют другие функциональные языки (например, Standard ML).

ответил Maurício C Antunes 2 J000000Tuesday13 2013, 03:28:38
0

Я удивлен, что вы не рассматриваете OCaml и F #, учитывая, что они решают многие ваши проблемы. Конечно, достойные и полезные среды разработки являются первоочередной задачей для учащихся? SML сильно отстает, а F # значительно опережает все остальные FPL в этом отношении.

Кроме того, как в OCaml, так и в F # есть списки.

ответил Jon Harrop 12 Maypm09 2009, 23:44:26
0

Haskell. Я впереди в своем классе по алгебре /теории в CS из-за того, что я узнал от использования Haskell. Это такой всеобъемлющий язык, и он научит вас тонне CS, просто используя его .

Тем не менее, SML намного легче выучить. У Haskell есть такие функции, как ленивые структуры оценки и контроля, которые делают его намного более мощным, но при этом затрачивая немало времени на обучение. У SML такой кривой нет.

Тем не менее, большая часть Haskell была отучена от менее научных /математических языков, таких как Ruby, ObjC или Python.

ответил Nate Symer 12 MaramThu, 12 Mar 2015 00:10:39 +03002015-03-12T00:10:39+03:0012 2015, 00:10:39

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132