|
|
| Строка 1: |
Строка 1: |
| {{Widgets}}
| | Великий и мощный Куккоев набегает! |
| {{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=Профессор абсурдологии}}
| |