Комментарии 18
Крышесносибельно.
Только одна маленькая придирка. Я с хаскелем знаком поверхностно, но насколько знаю ML, «f (x, y, z)» и «f x y z» — все же не одно и то же. Первое — передача в функцию одного параметра, кортежа из трех элементов. Второе — последовательная передача трех параметров через карринг, тут по сути вызов трех разных функций происходит. Ну и с вытекающими из этого фишками каждого из подходов.
Только одна маленькая придирка. Я с хаскелем знаком поверхностно, но насколько знаю ML, «f (x, y, z)» и «f x y z» — все же не одно и то же. Первое — передача в функцию одного параметра, кортежа из трех элементов. Второе — последовательная передача трех параметров через карринг, тут по сути вызов трех разных функций происходит. Ну и с вытекающими из этого фишками каждого из подходов.
+7
Речь идет о том, что в других языках скобки являются, помимо прочего, оператором вызова функции. Скобки нужны, даже если аргумент один, или же его вовсе нет.
В Хаскеле же, скобки для вызова функции не требуются, и даже если они есть — то они являются обычной конструкцией приоритета или создания кортежа, но никак не оператором вызова функции.
В Хаскеле же, скобки для вызова функции не требуются, и даже если они есть — то они являются обычной конструкцией приоритета или создания кортежа, но никак не оператором вызова функции.
0
Да, в Хаскеле можно написать
f (x, y, z) = ...
, но переведя это на другой язык, например PHP, получим:function f ($all) {
list($x,$y,$z) = $all;
...
}
+1
В математическом смысле функция нескольких переменных — это функция работающая на прямом произведении параметров, то есть, принимающая на вход именно кортежи.
Таким образом, f :: (x, y) -> z — можно воспринимать как некаррированную версию функции f:: x -> y -> z.
Таким образом, f :: (x, y) -> z — можно воспринимать как некаррированную версию функции f:: x -> y -> z.
0
Почему-то вспомнилось «Мозг сам дал себе название»
+2
> Например, подобной странной петлёй обладает рекурсивные акронимы: PHP…
Ну вот видите. даже в PHP есть поддержка этих самых петлей со стороны языка
Ну вот видите. даже в PHP есть поддержка этих самых петлей со стороны языка
+1
для любого высказывания P доказуемость высказывания «если доказуемо P, тогда P истинно» возможна только в случае доказуемости самого высказывания P
Стрелочки говорят о другом высказывании:
для любого высказывания P если доказуемо высказывание «если доказуемо P, тогда P истинно» то доказуемо само высказывание P
Стрелочки говорят о другом высказывании:
для любого высказывания P если доказуемо высказывание «если доказуемо P, тогда P истинно» то доказуемо само высказывание P
0
Спасибо! Было приятно поломать мозг утром.
Аппликативную функцию можно немножко подсластить:
Аппликативную функцию можно немножко подсластить:
($) :: (a -> b) -> a -> b
($) f = f
+1
($) :: (a -> b) -> a -> b
($) = id
Это справедливо для всех лямбда-систем, в которых можно
f x = g x
(любой x) эквивалентно f = g
(это свойство называется экстенсиональностью, само по себе эквивалентно наличию эта-редукции наровне с привычной бета-редукцией).0
Для любителей F# и OCaml можно попробовать следующий код для функции
moeb
:let rec moeb f x =
let rec go = lazy (f (fun z -> z go) x)
in
lazy go
+1
Хм… А зачем
rec
перед moeb
?0
не успел отредактировать )) Можно ещё и одно
lazy
убрать:let moeb f x =
let rec go = lazy (f (fun z -> z go) x)
in
go;;
+1
В ML, в отличие от Haskell в правых частях определений в let действует окружающий скоп. А let rec действует как в Haskell.
По мне так в ML правильнее — я даже на Haskell иногда пишу
Но это на любителя. Многие стиль Haskell предпочитают.
По мне так в ML правильнее — я даже на Haskell иногда пишу
case n+1 of n -> ...
Но это на любителя. Многие стиль Haskell предпочитают.
0
Решил совершить ещё один шажок к Хаскелю, поставил xmonad. Никто не знает, как подружить его с Cinnamon?
0
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Löb и möb: странные петли в Хаскеле