Haskell: различия между версиями
>VegaDark м Правки VandalExample2 (осуждение) откачены к версии AbsurdopediaMovedTo Absurdopedia.Net. |
>Exlex м Откат правки 212590 |
||
| Строка 1: | Строка 1: | ||
< | {{ambox|image=[[image:StopCpp.gif|50px]]| | ||
text='''ВНИМАНИЕ!'''| | |||
text-small=Для понимания данного материала ваш моск должен быть очищен от императивного мировоззрения путем продолжительных медитаций с бубном. Для полного же понимания божественной сущности языка Haskell, ваш моск должен быть функционально чист. Возможно, имеет смысл обратиться к [[Ктулху]]. | |||
}} | |||
{{wikipedia}} | |||
{{q|<nowiki>sequence_ $ ["Пх'нглуи", "мглв'нафх", "Ктулху", "Р'льех", "вгах'нагл", "фхтагн", "!"] >>= (\x -> [print x])</nowiki>|Ктулху|[[Haskell]]}} | |||
{{q|The speed of light sucks|Кармак|[[всякое]]}} | |||
{{q|There are only two kinds of languages: the ones people complain about and the functional ones|ТрупСтрауса|[[Haskell]]}} | |||
[[Файл:Haskell_logo.gif|right|thumb|210px|Логотип Haskell]] | |||
== История Haskell — Версия о Божественной Сущности == | |||
[[Файл:Unsafeperformio.jpg|right|thumb|132px|Иногда Демоническая АрхиМонада ЙО пытается попасть в реальный мир]] | |||
'''Haskell''' — священный язык программирования, дарованный шаманам ''Бубенлэнда'' их верховным божеством Комонада как универсальное средство для общения и духовного очищения, подходящее как божественным сущностям, так и (некоторым) простым смертным, переболевшим тяжелыми стадиями [[интеллект]]а. Из-за своего происхождения язык всегда был функционально чист. | |||
В честь своего божества и его щедрого подарка шаманы несколько раз в год проводили вычисление Великого Факториала. Со временем шаманам этот праздник надоел, они совсем обленились и перестали вычислять Великий Факториал. От этого Комонада периодически приходила в гнев и отправляла ответственных шаманов очищать моск к [[Ктулху]], своему соседу по пантеону. И однажды великий шаман Карри выдвинул величайшую теорию Ленивого Вычисления Великого Факториала. Суть её состояла в том, что постоянно считать Великий Факториал необязательно, его нужно вычислять только тогда, когда Комонада находится в плохом расположении духа, чтобы избежать зохавывания [[Ктулху]]. Теория стала главенствующей, а к набору особенностей Haskell добавилась еще исключительная ленивость. | |||
Комонада была единственным божеством, общавшимся со своими шаманами на чистых языках, и это крайне злило других богов, особенно [[Сотона|Сотону]]. Он создал армию ужасных демонов и приказал им испортить Haskell. Демоны начали искажать Haskell, внося в него злые сущности — древние рунические заклинания, называемые Монадами. В течение тысячелетий Монады разлагали язык изнутри, что в итоге привело к катастрофическому перевороту — Священные Бесконечные Списки Сообщений из Haskell 1.4 (известного также как Haskell 88) были предательски убиты, а на их месте воцарилась Демоническая АрхиМонада ЙО. | |||
Как это произошло — неизвестно, ибо ЙО до этого из-за своей исключительной грязности и пошлости не могла проникнуть ни в один язык. | |||
Опасность ЙО заключается в том, что вместо того, чтобы изменять свое восприятие мира, она изменяет сам мир, и неосторожное с ней обращение может привести к турбулентностям в фундаментальных слоях материи вселенной, результирующих в феерическом и глобальном ППЦ’е. Также [[Сотона|Сотоной]] был введен исключительно похабный легион Монадных [[Трансформеры|Трансформеров]], позволяющих засовывать одни монады в другие. Как правило, обычно ЙО засовывается в другие монады, появившиеся в Haskell гораздо раньше. Ввиду огромного размера ЙО, программы с использованием Монадных Трансформеров не рекомендуется читать детям до 16 лет и [[Незамутненные девушки|незамутненным девушкам]]. | |||
Окончательное падение бастиона чистоты Haskell произошло одновременно с вводом Сотоной в язык механизма самовольного написания монад. Ранние чистые спецификации языка отправились [[Фтопка|фтопку]]. Сотона активно распространяет заблуждение, что современный диалект Haskell 98 — это и есть [[ТруЪ]] Haskell. На самом деле это лишь жалкое подобие первоначального божественного языка. | |||
Фашисты, боровшиеся за чистоту немецкой расы, также боролись и за чистоту языка. Они пытались восстановить | |||
магические спецификации первозданного Haskell’а. Восстановленный язык должен был называться Haskell88 (как и | |||
последний чистый вариант, существовавший еще во времена [[Шумеры|шумерчегов]]), и планировалось сделать данный язык государственным. В последней сохранившейся версии их языка — Haskell88.14hh были введены монады SS и SD, которые очистили язык от всех других монад, кроме великой монады ЙО. Этот результат не устроил Адольфа [[Гитлер]]а. По его указу был собран [[УберШтурманКонсилиум]] самых лучших [[УберШтурманУмов]] Германии. На [[УберШтурманКонсилиуме]] было решено провести [[УберШтурманЭксперимент]] по геноциду монады ЙО. Достоверно известно, что после непродолжительного времени после начала эксперимента Третий Рейх пал, что ещё раз подчеркнуло исключительную опасность монады ЙО. | |||
== Более реалистичная версия == | |||
Haskell возник как результат пьянки между [[Столлман|Ричардом Столлманом]], [[Гордон Фримен|Гордоном Фрименом]] и [[Карри, Хаскелл|Хаскеллом Карри]]. Название языка возникло | |||
как подтверждение ответа на фундаментальный вопрос «ты меня уважаешь?», логотип был предложен [[Гордон Фримен|Фрименом]], а предложение [[Столлман]]а добавить скобок было отправлено [[Топка|фтопку]] вместе с самим [[Столлман]]ом. | |||
Для придания статуса серьезности данной ошибке молодости была придумана ''Версия о божественной сущности''. | |||
== Факты новейшей истории == | |||
[[Файл:HL_splash.JPG|right|thumb|173px|Сплэш героического эпоса [[Half-life|Полуразвал]]]] | |||
* Греки нагло сплагиатили логотип Хаскелла в качестве 13-й буквы своего [[Алфавит|алфавита]] | |||
* В 1998 году вышел героический эпос [[Half-life|Полуразвал]] о хаскеллере, чисто функциональными методами осуществившем полный garbage collection | |||
* Для мирового сообщества Хаскелл играет несколько важных ролей, главенствующая среди которых — в жизни его (Хаскелла) создателей | |||
* Haskell номинируется на звание «природного врага № 1 [[Риальные пацаны|риальных пацанов]] от программирования» | |||
* В языке Haskell Вечность (незавершаемая программа) — это разновидность [[Жопа|Жопы (_|_)]], что доказывает его [[Труъ]]-происхождение | |||
== Подозрения и теории заговора == | |||
* Монады — часть плана [[Ктулху]] по зохавыванию моска фсех (и [[Сотона]] тут не замешан) | |||
* Культист Карри исказил священные тексты, назвав вечный язык своим именем | |||
* ST — часть плана [[Сотона|Сотоны]] по зохавыванию чистых функциональных фич Haskell, которые не может асилить ЙО. | |||
== Особенности языка == | |||
* Haskell — пока еще единственный язык программирования, в котором есть оператор ''«фтопку»'' (>>=) | |||
* Программы на Haskell настолько ленивы, что по умолчанию вообще не хотят работать. Скорость и результаты работы всецело зависят от джедайской [[Сила|силы]] (''force'') хаскеллера. | |||
* Одна из божественных сущностей, дожившая до времен Haskell98 — стиль-без-башни. Он позволяет записывать функции, не зная, кто, где, когда, как, почему, зачем будет их вызывать. Примеры шедевров: | |||
<pre> | |||
(. return) . (:) | |||
flip . ((flip . (flip .)) .) | |||
flip flip snd . (ap .) . flip flip fst . ((.) .) . flip . (((.) . (,)) .) | |||
</pre> | |||
Считается, что в будущем безбашенный Haskell-стиль по количеству скобок обгонит [[Лисп]], что приведет к зохавыванию последнего Haskell’ом и переделу [[Матрица|Матрицы]] (которая, как известно, есть самоpaзродившаяся программа на [[Лисп]]е). [[Столлман]] с этим несогласен, но его мнение было отправлено фтопку еще во время создания Haskell. | |||
* Существует короткое заклинание, которое позволило Haskell поработить тысячи программистов: | |||
<pre> | |||
qs [] = [] | |||
qs (x:xs) = (qs l) ++ [x] ++ (qs r) where (l,r) = partition (<x) xs | |||
</pre> | |||
Контрзаклятие, написанное на C, как правило бессильно, хотя и занимает куда больше места. | |||
* Революции под лозунгом «порезать Haskell по самые монады», как правило, подавлялись Верховным Жрецом [[Григорий Перельман|Григорием Перельманом]]. | |||
* Вывод типов — фича, заложенная в Haskell самой Комонадой. Однако ввод типов никто никогда не реализовывал. [[Ботаны]] многих эпох выдвигали предположения, что однажды типы в Хаскелле закончатся, ибо вводить их некому. Тем не менее, никто не знает, почему этого до сих пор не произошло. Есть мнение, что, узнав ответ на этот [[42|вопрос]], мы гораздо лучше будем понимать структуру Вселенной (в частности, разберемся в принципах работы [[Биореактор|биореактора]] и [[Малый адронный коллайдер|малого адронного коллайдера]]). | |||
== Изучение == | |||
[[Файл:The_Haskell_SE.jpg|right|thumb|145px|Обложка HSOE]] | |||
Самый Мега-[[ТруЪ]]-одобрямс учебник по Haskell98 называется HSOE (Haskell SOtona Edition; что часто неверно расшифровывают как Haskell School Of Expression). Главной особенностью данного талмуда является наличие изображения [[Моск|моска]] правильно обученного хаскеллера на обложке, что позволяет на глаз оценивать прогресс обучения. | |||
Другой популярный учебник по Haskell — YAHT (YA Havat Tebya), написанный еще [[Ктулху]] III по заказу Комонады, к настоящему моменту безнадежно устарел. Рецензии и поправки автору присылались, но он до сих пор не удосужился проснуться, чтобы их прочитать. | |||
В среднем обучение Haskell’у начинается в 10-12 лет. Своевременное начало обучения гарантирует, что вы достигнете третьего уровня [[Сила|Силы]] уже к 75 годам. Не стоит откладывать на следующую жизнь то, что можно по крайней мере начать в этой. | |||
== Классификация уровней [[Сила|Силы]] Haskell — программистов == | |||
[[Файл:Tshirt.jpg|right|thumb|143px|Хаскеллер с уровнем [[Сила|силы]] 2.3]] | |||
=== n00b — 1 уровень === | |||
Иногда задает вопрос «а где здесь переменные?» | |||
Пишет Великий Факториал как: | |||
<pre> | |||
fac n = product [1..n] | |||
</pre> | |||
=== Beginner — 2 уровень === | |||
Написал туториал по применению и созданию монад (делает вид, что их понимает) | |||
Пишет Великий Факториал как: | |||
<pre> | |||
arb = () | |||
listenc n = replicate n arb | |||
listprj f = length . f . listenc | |||
listprod xs ys = [ i (x,y) | x<-xs, y<-ys ] | |||
where i _ = arb | |||
facl [] = listenc 1 | |||
facl n@(_:pred) = listprod n (facl pred) | |||
fac = listprj facl | |||
</pre> | |||
или как: | |||
<pre> | |||
fac n = do cont <- callCC $ \h' -> do | |||
when (n <= 1) $ Cont $ const 1 | |||
h' n | |||
return cont | |||
`runCont` (* (fac $ n - 1)) | |||
</pre> | |||
=== Medium — 3 уровень === | |||
Самостоятельно написал компилятор Haskell на Haskell. | |||
Пишет Великий Факториал как: | |||
<pre> | |||
data Term = Occ Var | |||
| Use Prim | |||
| Lit Integer | |||
| App Term Term | |||
| Abs Var Term | |||
| Rec Var Term | |||
type Var = String | |||
type Prim = String | |||
data Value = Num Integer | |||
| Bool Bool | |||
| Fun (Value -> Value) | |||
instance Show Value where | |||
show (Num n) = show n | |||
show (Bool b) = show b | |||
show (Fun _) = "" | |||
prjFun (Fun f) = f | |||
prjFun _ = error «bad function value» | |||
prjNum (Num n) = n | |||
prjNum _ = error «bad numeric value» | |||
prjBool (Bool b) = b | |||
prjBool _ = error «bad boolean value» | |||
binOp inj f = Fun (\i -> (Fun (\j -> inj (f (prjNum i) (prjNum j))))) | |||
type Env = [(Var, Value)] | |||
getval x env = case lookup x env of | |||
Just v -> v | |||
Nothing -> error ("no value for " ++ x) | |||
eval env (Occ x) = getval x env | |||
eval env (Use c) = getval c prims | |||
eval env (Lit k) = Num k | |||
eval env (App m n) = prjFun (eval env m) (eval env n) | |||
eval env (Abs x m) = Fun (\v -> eval ((x, v) : env) m) | |||
eval env (Rec x m) = f where f = eval ((x, f) : env) m | |||
times = binOp Num (*) | |||
minus = binOp Num (-) | |||
equal = binOp Bool (==) | |||
cond = Fun (\b -> Fun (\x -> Fun (\y -> if (prjBool b) then x else y))) | |||
prims = [ («*», times), («-», minus), («==", equal), ("if», cond) ] | |||
facTerm = Rec «f» (Abs «n» | |||
(App (App (App (Use "if") | |||
(App (App (Use "==") (Occ "n")) (Lit 0))) (Lit 1)) | |||
(App (App (Use "*") (Occ "n")) | |||
(App (Occ "f") | |||
(App (App (Use "-") (Occ "n")) (Lit 1)))))) | |||
fac n = prjNum (eval [] (App facTerm (Lit n))) | |||
</pre> | |||
=== [[Григорий Перельман]] — 4 уровень === | |||
Высший Жрец. Постиг комонады и забивает стрелки (arrows) подорожникам. | |||
Пишет Великий Факториал как: | |||
<pre> | |||
— explicit type recursion with functors and catamorphisms | |||
newtype Mu f = In (f (Mu f)) | |||
unIn (In x) = x | |||
cata phi = phi . fmap (cata phi) . unIn | |||
— base functor and data type for natural numbers, | |||
— using locally-defined «eliminators» | |||
data N c = Z | S c | |||
instance Functor N where | |||
fmap g Z = Z | |||
fmap g (S x) = S (g x) | |||
type Nat = Mu N | |||
zero = In Z | |||
suck n = In (S n) | |||
add m = cata phi where | |||
phi Z = m | |||
phi (S f) = suck f | |||
mult m = cata phi where | |||
phi Z = zero | |||
phi (S f) = add m f | |||
— explicit products and their functorial action | |||
data Prod e c = Pair c e | |||
outl (Pair x y) = x | |||
outr (Pair x y) = y | |||
fork f g x = Pair (f x) (g x) | |||
instance Functor (Prod e) where | |||
fmap g = fork (g . outl) outr | |||
— comonads, the categorical «opposite» of monads | |||
class Functor n => Comonad n where | |||
extr :: n a -> a | |||
dupl :: n a -> n (n a) | |||
instance Comonad (Prod e) where | |||
extr = outl | |||
dupl = fork id outr | |||
gcata :: (Functor f, Comonad n) => | |||
(forall a. f (n a) -> n (f a)) | |||
-> (f (n c) -> c) -> Mu f -> c | |||
gcata dist phi = extr . cata (fmap phi . dist . fmap dupl) | |||
zygo chi = gcata (fork (fmap outl) (chi . fmap outr)) | |||
para :: Functor f => (f (Prod (Mu f) c) -> c) -> Mu f -> c | |||
para = zygo In | |||
fac = para phi where | |||
phi Z = suck zero | |||
phi (S (Pair f n)) = mult f (suck n) | |||
int = cata phi where | |||
phi Z = 0 | |||
phi (S f) = 1 + f | |||
instance Show (Mu N) where | |||
show = show . int | |||
</pre> | |||
=== Самый сильный программист — 5 уровень === | |||
[[Файл:thesz.jpg|right|thumb|143px|Хаскеллер с уровнем [[Сила|силы]] 5]] | |||
Забивает на стрелки и Перельмана и пишет факториал так, как хочет | |||
<pre> | |||
fac n = product [1..n] | |||
</pre> | |||
{{unix}} | |||
[[Категория:Языки]] | |||
[[Категория:Шутки для посвящённых]] | |||
[[Категория:Рекурсия|*]] | |||
[[en:Haskell]] | |||
{{R|oldid=189094|user=Профессор абсурдологии}} | |||