Haskell: различия между версиями

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