Я розумію, що спізнююсь на вечірку, але у вас тут було два теоретичні відповіді, і я хотів запропонувати практичну альтернативу пережовуванню. Я підходжу до цього як родич Haskell noob, який, проте, нещодавно був проведений силовим маршем через тему Стрілки для проекту, над яким я зараз працюю.
По-перше, ви можете продуктивно вирішити більшість проблем у Haskell, не тягнучись до стрілок. Деякі помітні Haskellers справді не люблять і не користуються ними (див. Тут , тут і тут докладніше про це). Тож якщо ви говорите собі "Ей, мені це не потрібно", розумійте, що ви справді можете бути правильними.
Що мене найбільше засмутило у Стрілок, коли я вперше дізнався їх, - це те, як підручники з цього питання неминуче досягали аналогії схеми. Якщо ви подивитесь на код стрілки - принаймні, сортований сорт - він не нагадує ні що так багато, як Hardware Definding Language. Ваші входи розташовуються праворуч, ваші виходи ліворуч, і якщо ви не вдається провести їх належним чином, вони просто не спрацюють. Я подумав собі: справді? Тут ми закінчилися? Чи ми створили мову настільки високого рівня, що вона вкотре складається з мідних дротів та пайки?
Правильна відповідь на це, наскільки я зміг визначити: « Насправді, так. Наразі випадки використання вбивць для стрілок - це FRP (подумайте, Yampa, ігри, музика та реактивні системи взагалі). Проблема, з якою стикається FRP, є значною мірою тією самою проблемою, що стоїть перед усіма іншими системами синхронних повідомлень: як з'єднати безперервний потік входів у безперервний потік виходів без скидання відповідної інформації або пружинних витоків. Ви можете моделювати потоки у вигляді списків - кілька останніх систем FRP використовують такий підхід, - але коли у вас є багато вхідних списків, керувати ними стає майже неможливо. Вам потрібно ізолювати себе від струму.
Що дозволяють стрілки в системах FRP - це склад функцій в мережі, в той же час цілком абстрагуючи будь-яке посилання на базові значення, передані цими функціями. Якщо ви новачок у FP, спочатку це може бути заплутаним, а потім вражаючим розумом, коли ви поглинули його наслідки. Ви лише нещодавно поглинули думку про те, що функції можна абстрагувати та як зрозуміти такий список, як [(*), (+), (-)]
тип типу [(a -> a -> a)]
. За допомогою стрілок ви можете просунути абстракцію ще одним шаром.
Ця додаткова здатність до абстрактного несе із собою свої небезпеки. З одного боку, він може підштовхнути GHC до кутових випадків, коли він не знає, що робити з припущень вашого типу. Вам доведеться бути готовим думати на рівні типу - це прекрасна можливість дізнатися про види та типи RankNType та інші подібні теми.
Є також ряд прикладів того, що я б назвав "Stupid Arrow Stunts", де кодер досягає якогось комбінатора стрілок лише тому, що він чи вона хоче показати акуратний трюк з кортежами. (Ось мій власний банальний внесок у божевілля .) Не соромтесь ігнорувати таку гарячу собаку, коли натрапляєте на неї в дикій природі.
ПРИМІТКА. Як я вже згадував вище, я родич нобі. Якщо я оприлюднив помилки вище, будь ласка, виправте мене.