Я буду викладати курс нижчого відділу в дискретних структурах. Я вибрав підручник " Дискретні структури, логіка та обчислюваність" частково, оскільки він містить приклади та концепції, сприятливі для реалізації за допомогою функціональної мови програмування. (Я також вважаю, що це хороший підручник.)
Я хочу, щоб зрозуміла мова FP ілюструвала концепції DS та якими можуть користуватися студенти. Більшість студентів мали б у кращому випадку лише один-два семестри програмування на Java. Подивившись на Scheme, Erlang, Haskell, Ocaml та SML, я зупинився на Haskell або Standard ML. Я схиляюся до Haskell з причин, викладених нижче, але я хотів би думки тих, хто є активним програмістом в тому чи іншому.
- І Haskell, і SML мають узгодження шаблонів, що робить опис рекурсивного алгоритму надзвичайним.
- Haskell має чудові розуміння списків, які добре поєднуються з способом математичного вираження таких списків.
- Хаскелл має ліниву оцінку. Чудово підходить для побудови нескінченних списків за допомогою техніки розуміння списків.
- SML має справді інтерактивний інтерпретатор, в якому функції можна як визначати, так і використовувати. У Haskell функції повинні бути визначені в окремому файлі та скомпільовані перед використанням в інтерактивній оболонці.
- SML дає явне підтвердження аргументу функції та типів повернення в синтаксисі, який легко зрозуміти. Наприклад: val foo = fn: int * int -> int. Явний синтаксис каррі Хаскелла трохи більш тупий, але не зовсім чужий. Наприклад: foo :: Int -> Int -> Int.
- Haskell використовує цілі числа довільної точності за замовчуванням. Це зовнішня бібліотека в SML / NJ. А за замовчуванням SML / NJ скорочує вивід до 70 символів.
- Лямбда-синтаксис Хаскелла тонкий - він використовує одну зворотну косу риску. SML є більш явним. Не впевнений, що нам коли-небудь знадобиться лямбда в цьому класі.
По суті, SML і 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!