Pull to refresh

Comments 18

Крышесносибельно.

Только одна маленькая придирка. Я с хаскелем знаком поверхностно, но насколько знаю ML, «f (x, y, z)» и «f x y z» — все же не одно и то же. Первое — передача в функцию одного параметра, кортежа из трех элементов. Второе — последовательная передача трех параметров через карринг, тут по сути вызов трех разных функций происходит. Ну и с вытекающими из этого фишками каждого из подходов.
Речь идет о том, что в других языках скобки являются, помимо прочего, оператором вызова функции. Скобки нужны, даже если аргумент один, или же его вовсе нет.

В Хаскеле же, скобки для вызова функции не требуются, и даже если они есть — то они являются обычной конструкцией приоритета или создания кортежа, но никак не оператором вызова функции.
Да, в Хаскеле можно написать f (x, y, z) = ..., но переведя это на другой язык, например PHP, получим:
function f ($all) {
    list($x,$y,$z) = $all;
    ...
}
В математическом смысле функция нескольких переменных — это функция работающая на прямом произведении параметров, то есть, принимающая на вход именно кортежи.

Таким образом, f :: (x, y) -> z — можно воспринимать как некаррированную версию функции f:: x -> y -> z.
Почему-то вспомнилось «Мозг сам дал себе название»
> Например, подобной странной петлёй обладает рекурсивные акронимы: PHP…

Ну вот видите. даже в PHP есть поддержка этих самых петлей со стороны языка
)) я бы не был столь оптимистичен. Хотя как знать, странные петли можно увидеть там, где этого не ожидаешь.
для любого высказывания P доказуемость высказывания «если доказуемо P, тогда P истинно» возможна только в случае доказуемости самого высказывания P

Стрелочки говорят о другом высказывании:

для любого высказывания P если доказуемо высказывание «если доказуемо P, тогда P истинно» то доказуемо само высказывание P
Спасибо! Было приятно поломать мозг утром.
Аппликативную функцию можно немножко подсластить:
($) :: (a -> b) -> a -> b
($) f = f

($) :: (a -> b) -> a -> b
($) = id

Это справедливо для всех лямбда-систем, в которых можно f x = g x (любой x) эквивалентно f = g (это свойство называется экстенсиональностью, само по себе эквивалентно наличию эта-редукции наровне с привычной бета-редукцией).
вообще суть аппликативной функции, из-за которой её используют, в крайне низкой инфиксности:
infixr 0 $
Для любителей F# и OCaml можно попробовать следующий код для функции moeb:

let rec moeb f x = 
   let rec go = lazy (f (fun z -> z go) x) 
   in
   lazy go
не успел отредактировать )) Можно ещё и одно lazy убрать:

let moeb f x =
   let rec go = lazy (f (fun z -> z go) x)
   in
       go;;
В ML, в отличие от Haskell в правых частях определений в let действует окружающий скоп. А let rec действует как в Haskell.
По мне так в ML правильнее — я даже на Haskell иногда пишу
case n+1 of n -> ...

Но это на любителя. Многие стиль Haskell предпочитают.
Решил совершить ещё один шажок к Хаскелю, поставил xmonad. Никто не знает, как подружить его с Cinnamon?
Sign up to leave a comment.

Articles