Через те що у Haskell аргументи функції не вкладаються у дужки при спробі передати результат однієї функції в іншу потрібно використати дужки для групування.

foo bar x -- Функції передаються два аргументи bar і x foo (bar x) -- Функції bar передається аргумент x і її результат підставиться як один аргумент функції foo

У цьому простому прикладі все виглядає просто і зрозуміло, але якщо у нас був би складніший вираз з іншими дужками все виглядало б не так зрозуміло.

Для полегшення додали спеціальний оператор зниження пріоритету. Складається він з одного символу $. Використати його ми можемо тут підставивши між функціями.

foo $ bar x

Результат буде той же що й з дужками.

Цей оператор має праву асоціативність і найнижчий пріоритет. Перевірити це ми можемо в інтерпретаторі.

> :i ($) ($) :: (a -> b) -> a -> b -- Defined in ‘GHC.Base’ infixr 0 $

Тако ж у цьому повідомленні ми бачимо тип цього оператора. Він приймає іншу функцію й аргумент цієї функції, а повертає результат цієї функції. Визначення цього оператора таке.

($) f x = f x

#ukrhaskell #програмування #haskell #оператор #$ #пріоритет #функції

Social.Net.Ua

@balaraz розкажіть, як ви зараз думаєте, навіщо оцей хаскель потрібен, які у нього переваги над імперативними мовами? (btw тег #ukrhaskell прикольний, буду користуватись)
@victor_tokarev
Наразі я ще сам всього не знаю. Я у процесі вивчення і коли краще з цим всім розберусь я думав скласти список переваг з поясненням.
Зараз я знаю тільки про "ліниве виконання" і "спрощений паралелізм".
@balaraz добре. Цікаво буде почитати, бо у мене Haskell - перша мова, та і бекграунд інший.
@victor_tokarev У якому розумінні перша мова? Ти зараз починаєш вивчення, чи починав з неї колись?
@balaraz друге
@victor_tokarev
Ну і як тобі? Які переваги? На якому рівні ти знаєш його?
@balaraz дивлячись із чим порівнювати. В цілому мені норм. Тестування ніколи не проходив, тому хз як оцінити рівень.
@balaraz наприклад, якщо порівнювати Haskell та Fortran, то Haskell гірше (нема і напевне не може бути GPU бекенду, тільки eDSL, всі з яких знаходяться в різному стані готовності і створені для різних цілей; повільніші масиви і взагалі FFI boundary crossing; ситуація з SIMD; більші бінарники, їх важче статично злінкувати) і одночасно краще (бо є параметричний поліморфізм, HKT, менеджер пакетів, зелені треди і STM). Щось схоже можна написати про Rust чи Python.
@victor_tokarev
А яка найкраща мова серед функціональних на твою думку?
@balaraz F* (жарт). Найкращої немає. Нормальні IMHO це Haskell, OCaml, Purescript (Elm занадто спрощений), Scheme топ. Unison класний теж. Idris вічно в розробці, Futhark заточений під GPU, F# законт(закреслено)проклятий майкрософтом.
@balaraz втім, слід сказати що я просто інформований аматор і на 100% в чомусь помиляюсь
@victor_tokarev @balaraz я літаральна закахаўся пасля таго, як адчуў «кампілюецца — значыць працуе» на ўласным досведзе: прыслаў наіўны https://github.com/commercialhaskell/stack/pull/3763, падрыхтаваўся да пінг-понгу, замест гэтага паправіў фармат вываду згодна заўваг і ўсё, PR прыняты. Я да гэтага 16 год праграмістам адпрацаваў і гэта было, так бы мовіць, нечакана.
Report currently building packages along with "Progress:" label by develop7 · Pull Request #3763 · commercialhaskell/stack

Rationale: make user feel more "in control" when waiting for these tens to hundreds of packages to be built by providing information on what is building now. Build progress line beforeProgress: 3/7...

GitHub
@adziahel о, то ви додали це в stack? Клас.
Щодо "компілюється = працює" я не зовсім згоден, але розумію чому так кажуть.