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

Материал из Абсурдопедии
Перейти к навигации Перейти к поиску
>VandalExample2
Блин. Эти пpaвки - cпeциaльнo, чтoб oчистить recentchanges
Mass interwiki fix
 
(не показано 11 промежуточных версий 11 участников)
Строка 1: Строка 1:
{{locked|anon}}[[Изображение:Nerd-46422.jpg|thumb|Типичный программист на Haskell]]
{{ambox|image=[[image:StopCpp.gif|50px]]|
[[Изображение:Z150 03.jpg|thumb|Ещё один [http://thesz.livejournal.com/911142.html типичный программист] на Haskell]]
text='''ВНИМАНИЕ!'''|
{{Q|Хаскель — это как ламборджини в деревне. Немного подрочил — и пошел работать на тракторе.| Ксеноцефал}}
text-small=Для понимания данного материала ваш моск должен быть очищен от императивного мировоззрения путем продолжительных медитаций с бубном. Для полного же понимания божественной сущности языка Haskell, ваш моск должен быть функционально чист и не иметь побочных эффектов. Возможно, имеет смысл обратиться к [[Ктулху]].
'''Haskell''' — функциональный декларативный язык [[Программист|программирования]], первая версия которого была стандартизирована в 1990 году, назван в честь математика Хаскелла Карри <!--- , придумавшего слово <s>манда</s> «монада». Или не придумавшего<ref>Типа он раньше Лейбница жил, да? Монада (от греч. — μονας, род. п. μοναδος — единица, единое), понятие, обозначающее в различных философских учениях основополагающие элементы бытия: число в пифагореизме; единое в неоплатонизме; единое начало бытия в пантеизме Дж. Бруно; психически активная субстанция в монадологии Г. В. Лейбница, воспринимающая и отражающая другую монаду и весь мир («монада зеркало Вселенной»).</ref>. Но придумавшего [[:en.w:Currying|карринг]]. Или не придумавшего<ref>Also sprach wikipedia: Карринг (англ. currying) — понятие, введённое Моисеем Исаевичем [[ЕРЖ|Шейнфинкелем]] и Г. Фреге, является преобразованием функции от пары аргументов в функцию, берущую свои аргументы по одному. Это преобразование получило свое название в честь Х. Карри.</ref>. Но разработавшего теорию категорий для объяснения значения этих слов. Или не разработавшего<ref>Х. Карри занимался комбинаторной логикой, и к теории категорий имеет весьма опосредованное отношение. Кому особо интересно — см. [[:en.w:Category theory#Historical notes|тут]] и [[:en.w:Haskell Curry|тут]].</ref> --->. Язык Haskell известен благодаря синтаксису, в сравнении с которым [[пёрл]] выглядит псевдокодом, а также необходимостью глубокого понимания лямбда-исчисления, замыканий, теории графов, теории категорий, сопромата, анатомии мозга и прочего [[матан]]а даже для вывода на экран строки «Hello, World!»
}}
{{note|yt|E1FPSeF4-xM|На самом деле, все просто}}
{{wikipedia}}
== История ==
{{q|<nowiki>sequence_ $ ["Пх'нглуи", "мглв'нафх", "Ктулху", "Р'льех", "вгах'нагл", "фхтагн", "!"] >>= (\x -> [print x])</nowiki>|Ктулху|Haskell}}
[[Изображение:Cmp.jpg|thumb|Наглядная демонстрация Мощи языка]]
В 1958 году был изобретён первый функциональный язык программирования — [[Лисп|Lisp]]. К 80-м годам прошлого века функциональных языков стало очень много. Каждый [[задрот]] считал своим долгом изобрести свой. И вот однажды, в 1987 году было решено создать язык, который бы включал лучшие достижения из всех языков программирования. Собрался специальный комитет из отборнейших [[задрот|задротов]] и без лишнего шума создали его. Предшественниками хаскеля были ML, SML, Miranda. Кроме того туда добавили немного лиспа, пролога, [[матан|матана]] и ещё чего-то там. Что касается названия, то однажды во время пьянки задроты просто взяли и выбрали общим голосованием «хаскель» из 25 [[рандом|рандомных]] слов. [http://research.microsoft.com/en-us/um/people/simonpj/papers/history-of-haskell/history.pdf Читай @ просвещайся].


== Хаскель, чаны и все-все-все ==
{{q|The speed of light sucks|Кармак|[[всякое]]}}
Хаскель и [[лисп]] — популярные и постоянные мемы в /[[s]]/ и /[[prog]]/. Как это сочетается с большой популярностью хаскеля в очень узкой академической среде — [[Всем похуй|не ясно]].


== Востребованность ==
{{q|There are only two kinds of languages: the ones people complain about and the functional ones|ТрупСтрауса|Haskell}}


Как и положено в таких вещах, ярость отдельных сторонников языка обратно пропорциональна его востребованности на рынке. Согласно проведенным с участием авторитетных анонимусов исследованиям, в мире на данный момент насчитывается [http://www.haskell.org/haskellwiki/Jobs около 8] реальных вакансий для программистов на хаскеле. В остальных случаях знание хаскеля рассматривается, как правило, как незначительный плюс. Известен случай, когда знание хаскеля рассматривался как существенный недостаток кандидата{{prooflink}}.
[[Файл:Haskell_logo.gif|right|thumb|210px|Логотип Haskell]]


Не будем забывать, что хаскель наиболее активно разрабатывается в недрах Microsoft Research. Nuff Said. Обыдленный хаске...[[^W]] ML под названием F# включен в Visual Studio 2010, а это значит что скоро знание хаскеля будет как минимум преимуществом при поступлении на работу.
== История Haskell — Версия о Божественной Сущности ==
[[Файл:Unsafeperformio.jpg|right|thumb|132px|Иногда Демоническая АрхиМонада ЙО пытается попасть в реальный мир]]
'''Haskell''' — священный язык программирования, дарованный шаманам ''Бубенлэнда'' их верховным божеством Комонада как универсальное средство для общения и духовного очищения, подходящее как божественным сущностям, так и (некоторым) простым смертным, переболевшим тяжелыми стадиями [[интеллект]]а. Из-за своего происхождения язык всегда был функционально чист.


== Примеры кода на Haskell ==
В честь своего божества и его щедрого подарка шаманы несколько раз в год проводили вычисление Великого Факториала. Со временем шаманам этот праздник надоел, они совсем обленились и перестали вычислять Великий Факториал. От этого Комонада периодически приходила в гнев и отправляла ответственных шаманов очищать моск к [[Ктулху]], своему соседу по пантеону. И однажды великий шаман Карри выдвинул величайшую теорию Ленивого Вычисления Великого Факториала. Суть её состояла в том, что постоянно считать Великий Факториал необязательно, его нужно вычислять только тогда, когда Комонада находится в плохом расположении духа, чтобы избежать зохавывания [[Ктулху]]. Теория стала главенствующей, а к набору особенностей Haskell добавилась еще исключительная ленивость.
Так на haskell пишут [[перл]]овцы:
<source haskell>
import Random;import List;import Char;p=putStrLn;u=uncurry;f x=(x\\).(x\\)
main=mapM(\x->randomRIO(49,54))[1..4]>>=n 0.map chr>>=p.("Tries: "++).show
e=((partition$u(==)).).zip;h(p,q)=['*'|x<-p]++['+'|x<-(u f)$unzip q]
n a s=getLine>>=m where{m i|i==s=return a;m i=p(h$e i s)>>n(a+1)s}
</source>
[[Hello world]]:
<source haskell>
main = print "Hello world"
</source>
Для олдфагов:
<source haskell>
{-# OPTIONS_GHC -fno-warn-type-defaults #-}
{-# LANGUAGE ExtendedDefaultRules, OverloadedStrings #-}
module Hello where
import Language.BASIC


main :: IO ()
Комонада была единственным божеством, общавшимся со своими шаманами на чистых языках, и это крайне злило других богов, особенно [[Сотона|Сотону]]. Он создал армию ужасных демонов и приказал им испортить Haskell. Демоны начали искажать Haskell, внося в него злые сущности — древние рунические заклинания, называемые Монадами. В течение тысячелетий Монады разлагали язык изнутри, что в итоге привело к катастрофическому перевороту — Священные Бесконечные Списки Сообщений из Haskell 1.4 (известного также как Haskell 88) были предательски убиты, а на их месте воцарилась Демоническая АрхиМонада ЙО.
main = runBASIC $ do


    10 PRINT "Hello BASIC World!"
Как это произошло — неизвестно, ибо ЙО до этого из-за своей исключительной грязности и пошлости не могла проникнуть ни в один язык.
</source>
Вычисление факториала:
<source haskell>
fac n = product [1..n]
</source>
А так его пишут [[нуб]]ы:
<source haskell>
fac n = if n == 1 then 1 else (fac n-1) * n
</source>
Так — продвинутые нубы:
<source haskell>
fac 1 = 1
fac n = fac (n-1) * n
</source>
Любители [[матан]]а:
<source haskell>
s f g x = f x (g x)
k x y = x
b f g x = f (g x)
c f g x = f x g
y f = f (y f)
cond p f g x = if p x then f x else g x
fac = y (b (cond ((==) 0) (k 1)) (b (s (*)) (c b pred)))
</source>
[http://www.willamette.edu/~fruehr/haskell/evolution.html Ну и так далее].


А это программа на Haskell, которая выводит программу на Python, которая выводит программу на Ruby, которая выводит исходную программу на Haskell.
Опасность ЙО заключается в том, что вместо того, чтобы изменять свое восприятие мира, она изменяет сам мир, и неосторожное с ней обращение может привести к турбулентностям в фундаментальных слоях материи вселенной, результирующих в феерическом и глобальном ППЦ’е. Также [[Сотона|Сотоной]] был введен исключительно похабный легион Монадных [[Трансформеры|Трансформеров]], позволяющих засовывать одни монады в другие. Как правило, обычно ЙО засовывается в другие монады, появившиеся в Haskell гораздо раньше. Ввиду огромного размера ЙО, программы с использованием Монадных Трансформеров не рекомендуется читать детям до 16 лет и [[Незамутненные девушки|незамутненным девушкам]].
<source haskell>
q a b c=putStrLn $ b ++ [toEnum 10,'q','(']
  ++ show b ++ [','] ++ show c ++ [','] ++ show a ++ [')']
main=q "q a b c=putStrLn $ b ++ [toEnum 10,'q','(']  
++ show b ++ [','] ++ show c ++ [','] ++ show a ++ [')']"
  "def q(a,b,c):print b+chr(10)+'q('+repr(b)+','+repr(c)+','+repr(a)+')'"
  "def e(x) return 34.chr+x+34.chr end;def q(a,b,c) print
b+10.chr+'main=q '+e(b)+' '+e(c)+' '+e(a)+' '+10.chr end"
</source>


{{Шаблон:Языки программирования}}
Окончательное падение бастиона чистоты Haskell произошло одновременно с вводом Сотоной в язык механизма самовольного написания монад. Ранние чистые спецификации языка отправились [[Фтопка|фтопку]]. Сотона активно распространяет заблуждение, что современный диалект Haskell 98 — это и есть [[ТруЪ]] Haskell. На самом деле это лишь жалкое подобие первоначального божественного языка.


[[Категория:Языки программирования]]
Фашисты, боровшиеся за чистоту немецкой расы, также боролись и за чистоту языка. Они пытались восстановить
[[en.w:Haskell]]
магические спецификации первозданного Haskell’а. Восстановленный язык должен был называться Haskell88 (как и
[[de.w:Haskell]]
последний чистый вариант, существовавший еще во времена [[Шумеры|шумерчегов]]), и планировалось сделать данный язык государственным. В последней сохранившейся версии их языка — Haskell88.14hh были введены монады SS и SD, которые очистили язык от всех других монад, кроме великой монады ЙО. Этот результат не устроил Адольфа [[Гитлер]]а. По его указу был собран [[УберШтурманКонсилиум]] самых лучших [[УберШтурманУмов]] Германии. На [[УберШтурманКонсилиуме]] было решено провести [[УберШтурманЭксперимент]] по геноциду монады ЙО. Достоверно известно, что после непродолжительного времени после начала эксперимента Третий Рейх пал, что ещё раз подчеркнуло исключительную опасность монады ЙО.
[[w:Haskell]]
 
[[uk.w:Haskell]]
== Более реалистичная версия ==
 
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]]
[[en-gb:Haskell]]
[[Категория:Языки]]
[[Категория:Шутки для посвящённых]]
[[Категория:Рекурсия|*]]

Текущая версия от 18:04, 1 июня 2019

Для людей с оригинально извращённым чувством юмора так называемые «эксперты» из Википедии предлагают статью под названием Haskell
sequence_ $ ["Пх'нглуи", "мглв'нафх", "Ктулху", "Р'льех", "вгах'нагл", "фхтагн", "!"] >>= (\x -> [print x])
~ Ктулху про Haskell
The speed of light sucks
~ Кармак про всякое
There are only two kinds of languages: the ones people complain about and the functional ones
~ ТрупСтрауса про Haskell
Логотип Haskell

История Haskell — Версия о Божественной Сущности[править]

Иногда Демоническая АрхиМонада ЙО пытается попасть в реальный мир

Haskell — священный язык программирования, дарованный шаманам Бубенлэнда их верховным божеством Комонада как универсальное средство для общения и духовного очищения, подходящее как божественным сущностям, так и (некоторым) простым смертным, переболевшим тяжелыми стадиями интеллекта. Из-за своего происхождения язык всегда был функционально чист.

В честь своего божества и его щедрого подарка шаманы несколько раз в год проводили вычисление Великого Факториала. Со временем шаманам этот праздник надоел, они совсем обленились и перестали вычислять Великий Факториал. От этого Комонада периодически приходила в гнев и отправляла ответственных шаманов очищать моск к Ктулху, своему соседу по пантеону. И однажды великий шаман Карри выдвинул величайшую теорию Ленивого Вычисления Великого Факториала. Суть её состояла в том, что постоянно считать Великий Факториал необязательно, его нужно вычислять только тогда, когда Комонада находится в плохом расположении духа, чтобы избежать зохавывания Ктулху. Теория стала главенствующей, а к набору особенностей Haskell добавилась еще исключительная ленивость.

Комонада была единственным божеством, общавшимся со своими шаманами на чистых языках, и это крайне злило других богов, особенно Сотону. Он создал армию ужасных демонов и приказал им испортить Haskell. Демоны начали искажать Haskell, внося в него злые сущности — древние рунические заклинания, называемые Монадами. В течение тысячелетий Монады разлагали язык изнутри, что в итоге привело к катастрофическому перевороту — Священные Бесконечные Списки Сообщений из Haskell 1.4 (известного также как Haskell 88) были предательски убиты, а на их месте воцарилась Демоническая АрхиМонада ЙО.

Как это произошло — неизвестно, ибо ЙО до этого из-за своей исключительной грязности и пошлости не могла проникнуть ни в один язык.

Опасность ЙО заключается в том, что вместо того, чтобы изменять свое восприятие мира, она изменяет сам мир, и неосторожное с ней обращение может привести к турбулентностям в фундаментальных слоях материи вселенной, результирующих в феерическом и глобальном ППЦ’е. Также Сотоной был введен исключительно похабный легион Монадных Трансформеров, позволяющих засовывать одни монады в другие. Как правило, обычно ЙО засовывается в другие монады, появившиеся в Haskell гораздо раньше. Ввиду огромного размера ЙО, программы с использованием Монадных Трансформеров не рекомендуется читать детям до 16 лет и незамутненным девушкам.

Окончательное падение бастиона чистоты Haskell произошло одновременно с вводом Сотоной в язык механизма самовольного написания монад. Ранние чистые спецификации языка отправились фтопку. Сотона активно распространяет заблуждение, что современный диалект Haskell 98 — это и есть ТруЪ Haskell. На самом деле это лишь жалкое подобие первоначального божественного языка.

Фашисты, боровшиеся за чистоту немецкой расы, также боролись и за чистоту языка. Они пытались восстановить магические спецификации первозданного Haskell’а. Восстановленный язык должен был называться Haskell88 (как и последний чистый вариант, существовавший еще во времена шумерчегов), и планировалось сделать данный язык государственным. В последней сохранившейся версии их языка — Haskell88.14hh были введены монады SS и SD, которые очистили язык от всех других монад, кроме великой монады ЙО. Этот результат не устроил Адольфа Гитлера. По его указу был собран УберШтурманКонсилиум самых лучших УберШтурманУмов Германии. На УберШтурманКонсилиуме было решено провести УберШтурманЭксперимент по геноциду монады ЙО. Достоверно известно, что после непродолжительного времени после начала эксперимента Третий Рейх пал, что ещё раз подчеркнуло исключительную опасность монады ЙО.

Более реалистичная версия[править]

Haskell возник как результат пьянки между Ричардом Столлманом, Гордоном Фрименом и Хаскеллом Карри. Название языка возникло как подтверждение ответа на фундаментальный вопрос «ты меня уважаешь?», логотип был предложен Фрименом, а предложение Столлмана добавить скобок было отправлено фтопку вместе с самим Столлманом.

Для придания статуса серьезности данной ошибке молодости была придумана Версия о божественной сущности.

Факты новейшей истории[править]

Сплэш героического эпоса Полуразвал
  • Греки нагло сплагиатили логотип Хаскелла в качестве 13-й буквы своего алфавита
  • В 1998 году вышел героический эпос Полуразвал о хаскеллере, чисто функциональными методами осуществившем полный garbage collection
  • Для мирового сообщества Хаскелл играет несколько важных ролей, главенствующая среди которых — в жизни его (Хаскелла) создателей
  • Haskell номинируется на звание «природного врага № 1 риальных пацанов от программирования»
  • В языке Haskell Вечность (незавершаемая программа) — это разновидность Задницы (_|_), что доказывает его Труъ-происхождение

Подозрения и теории заговора[править]

  • Монады — часть плана Ктулху по зохавыванию моска фсех (и Сотона тут не замешан)
  • Культист Карри исказил священные тексты, назвав вечный язык своим именем
  • ST — часть плана Сотоны по зохавыванию чистых функциональных фич Haskell, которые не может асилить ЙО.

Особенности языка[править]

  • Haskell — пока еще единственный язык программирования, в котором есть оператор «фтопку» (>>=)
  • Программы на Haskell настолько ленивы, что по умолчанию вообще не хотят работать. Скорость и результаты работы всецело зависят от джедайской силы (force) хаскеллера.
  • Одна из божественных сущностей, дожившая до времен Haskell98 — стиль-без-башни. Он позволяет записывать функции, не зная, кто, где, когда, как, почему, зачем будет их вызывать. Примеры шедевров:
 (. return) . (:)
 flip . ((flip . (flip .)) .)
 flip flip snd . (ap .) . flip flip fst . ((.) .) . flip . (((.) . (,)) .)

Считается, что в будущем безбашенный Haskell-стиль по количеству скобок обгонит Лисп, что приведет к зохавыванию последнего Haskell’ом и переделу Матрицы (которая, как известно, есть самоpaзродившаяся программа на Лиспе). Столлман с этим несогласен, но его мнение было отправлено фтопку еще во время создания Haskell.

  • Существует короткое заклинание, которое позволило Haskell поработить тысячи программистов:
  qs [] = []
  qs (x:xs) = (qs l) ++ [x] ++ (qs r) where (l,r) = partition (<x) xs

Контрзаклятие, написанное на C, как правило бессильно, хотя и занимает куда больше места.

  • Революции под лозунгом «порезать Haskell по самые монады», как правило, подавлялись Верховным Жрецом Григорием Перельманом.
  • Вывод типов — фича, заложенная в Haskell самой Комонадой. Однако ввод типов никто никогда не реализовывал. Ботаны многих эпох выдвигали предположения, что однажды типы в Хаскелле закончатся, ибо вводить их некому. Тем не менее, никто не знает, почему этого до сих пор не произошло. Есть мнение, что, узнав ответ на этот вопрос, мы гораздо лучше будем понимать структуру Вселенной (в частности, разберемся в принципах работы биореактора и малого адронного коллайдера).

Изучение[править]

Обложка HSOE

Самый Мега-ТруЪ-одобрямс учебник по Haskell98 называется HSOE (Haskell SOtona Edition; что часто неверно расшифровывают как Haskell School Of Expression). Главной особенностью данного талмуда является наличие изображения моска правильно обученного хаскеллера на обложке, что позволяет на глаз оценивать прогресс обучения.

Другой популярный учебник по Haskell — YAHT (YA Havat Tebya), написанный еще Ктулху III по заказу Комонады, к настоящему моменту безнадежно устарел. Рецензии и поправки автору присылались, но он до сих пор не удосужился проснуться, чтобы их прочитать.

В среднем обучение Haskell’у начинается в 10-12 лет. Своевременное начало обучения гарантирует, что вы достигнете третьего уровня Силы уже к 75 годам. Не стоит откладывать на следующую жизнь то, что можно по крайней мере начать в этой.

Классификация уровней Силы Haskell — программистов[править]

Хаскеллер с уровнем силы 2.3

n00b — 1 уровень[править]

Иногда задает вопрос «а где здесь переменные?»

Пишет Великий Факториал как:


  fac n = product [1..n]

Beginner — 2 уровень[править]

Написал туториал по применению и созданию монад (делает вид, что их понимает)

Пишет Великий Факториал как:


  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   

или как:

fac n = do cont <- callCC $ \h' -> do
                   when (n <= 1) $ Cont $ const 1
                   h' n
           return cont
  `runCont` (* (fac $ n - 1))

Medium — 3 уровень[править]

Самостоятельно написал компилятор Haskell на Haskell.

Пишет Великий Факториал как:


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)))

Григорий Перельман — 4 уровень[править]

Высший Жрец. Постиг комонады и забивает стрелки (arrows) подорожникам.

Пишет Великий Факториал как:


— 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

Самый сильный программист — 5 уровень[править]

Хаскеллер с уровнем силы 5

Забивает на стрелки и Перельмана и пишет факториал так, как хочет


  fac n = product [1..n]