Я шукав в Інтернеті порівняння між F # і Haskell, але не знайшов нічого справді остаточного. Які основні відмінності і чому я хотів би вибрати одне над іншим?
Відповіді:
Haskell - це "чиста" функціональна мова, де як F # є аспекти як імперативу / ОО, так і функціональних мов. Haskell також має ліниве оцінювання, яке досить рідко зустрічається серед функціональних мов.
Що означають ці речі? Чисто функціональна мова означає відсутність побічних ефектів (або змін у загальному стані, коли функція викликана), що означає, що ви гарантовані, що якщо ви викликаєте f (x), нічого іншого не відбувається, крім повернення значення з функції, такі як вихід консолі, вихід бази даних, зміни глобальних або статичних змінних .. і хоча Haskell може мати нечисті функції (через монади), це повинно бути "явно" передбаченим через декларацію.
Чисті функціональні мови та програмування "Без побічних ефектів" набули популярності останнім часом, оскільки добре піддаються багатоядерному паралелізму, оскільки набагато складніше помилитися, не маючи спільного стану, а не безліч замків та семафорів.
Ліниве оцінювання - це те, коли функція НЕ оцінюється, доки це абсолютно не потрібно. це означає, що багатьох операцій можна уникнути, коли це не потрібно. Подумайте про це в базовому реченні C # if, наприклад:
if(IsSomethingTrue() && AnotherThingTrue())
{
do something;
}
Якщо IsSomethingTrue()
значення false, AnotherThingTrue()
метод ніколи не оцінюється.
Хоча Haskell є дивовижною мовою, головною перевагою F # (на даний момент) є те, що він сидить над CLR. Це надає можливість самостійного програмування поліглотів. Одного разу ви можете написати свій веб-інтерфейс у ASP.net MVC, свою бізнес-логіку на C #, свої основні алгоритми в F # та свої модульні тести в Ironruby .... Усе серед середовища .Net.
Послухайте радіо Software Engineering з Саймоном Пейтоном Джонсом, щоб отримати додаткову інформацію про Haskell: Episode 108: Simon Peyton Jones on Functional Programming and Haskell
Великі відмінності:
Подібність важливіша за різницю. В основному, вам слід використовувати F #, якщо ви вже в .NET, а Haskell - інакше. Крім того, ОО та лінощі означають, що F # ближче до того, що ви (мабуть) вже знаєте, тому, мабуть, легше навчитися.
Платформа: Haskell має власну середовище виконання, F # використовує .NET. Я не знаю, яка різниця в продуктивності, хоча я підозрюю, що середній код приблизно такий самий до оптимізації. F # має перевагу, якщо вам потрібні бібліотеки .NET.
Орієнтація на об'єкт: F # має OO і дуже обережно переконуєсь, що класи .NET прості у використанні, навіть якщо ваш код не OO. У Haskell є класи типів, які дозволяють робити щось на зразок OO, дивним чином. Вони схожі на рубінові міксини, схрещені із загальними функціями Common Lisp. Вони трохи схожі на інтерфейси Java / C #.
Лінощі: Хаскелл ледачий, F # ні. Лінь дозволяє кілька приємних трюків і змушує деякі речі, які виглядають повільно, виконуватися швидко. Але мені набагато важче здогадатися, як швидко працює мій код. Обидві мови дозволяють використовувати іншу модель, ви просто повинні чітко про це вказати у своєму коді.
Незначні відмінності:
F # є частиною сімейства мов ML і дуже близький до OCaml. Можливо, ви захочете прочитати цю дискусію про відмінності між Haskell та OCaml .
Основною відмінністю, яка, мабуть, є результатом чистоти, але я менш бачу згадуваного, є поширене використання монад. Як часто зазначається, монади можна будувати майже будь-якою мовою, але життя сильно змінюється, коли вони широко використовуються в бібліотеках, і ти використовуєш їх сам.
Монади надають щось набагато обмеженіше в інших мовах: абстракція управління потоком. Вони є неймовірно корисними та елегантними способами робити всілякі речі, і рік Haskell повністю змінив спосіб програмування, так само, як перехід від імперативного до програмування ОО багато років тому змінив його, або, набагато пізніше, використовуючи функції вищого порядку.
На жаль, у такому просторі немає можливості надати достатньо розуміння, щоб зрозуміти, в чому різниця. Насправді, жодна письмова робота цього не зробить; Вам просто потрібно витратити достатньо часу на вивчення та написання коду, щоб отримати реальне розуміння.
Крім того, F # іноді може стати дещо менш функціональним або більш незграбним (з точки зору функціонального програмування), коли ви взаємодієте з платформою .NET / бібліотеками, оскільки бібліотеки, очевидно, були розроблені з точки зору OO.
Отже, ви можете розглянути своє рішення таким чином: ви хочете спробувати одну з цих мов, щоб отримати швидкий, відносно невеликий крок вдосконалення, або ви готові витратити більше часу і отримати менш негайну вигоду для чогось більшого в довгостроковій перспективі. (Або, принаймні, якщо у вас не виходить чогось більшого, легка можливість швидко переключитися на інше?) Якщо перший, F # - це ваш вибір, якщо другий - Хаскелл.
Пара інших непов'язаних моментів:
Haskell має трохи приємніший синтаксис, що не є сюрпризом, оскільки дизайнери Haskell досить добре знали ML. Однак легкий синтаксис F # робить великий шлях до вдосконалення синтаксису ML, тому там немає величезного розриву.
Що стосується платформ, F #, звичайно, .NET; наскільки добре це буде працювати на Mono, я не знаю. GHC компілюється в машинний код із власним середовищем виконання, добре працює як під Windows, так і під Unix, який порівнює з .NET так само, як це, скажімо, робить C ++. Це може бути перевагою за деяких обставин, особливо з точки зору швидкості та нижчого рівня доступу до машини. (Наприклад, у мене не виникло проблем із написанням сервера DDE у Haskell / GHC; я не думаю, що ви могли б це робити будь-якою мовою .NET, і, незважаючи на це, MS, безумовно, не хоче, щоб ви це робили.)
Ну, для одного я б сказав, що основною перевагою є те, що F # компілюється проти платформи .NET, що полегшує його розгортання на Windows. Я бачив приклади, які пояснювали використання F # у поєднанні з ASP.NET для створення веб-додатків ;-)
З іншого боку, Хаскелл існує довше, тому я думаю, що група людей, які є справжніми знавцями цієї мови, набагато більша.
Наразі для F # я бачив лише одну реальну реалізацію, яка є доказом особливості концептуальної ОС. Я бачив більше реальних реалізацій Haskell.