Архив метки: Haskell

Знаешь язык программирования? И вообще много знаешь? А HASKELL НЕ ЗНАЕШЬ?! Почитай тему с моими примерами небольших программ, заметками и всякой ерундой!

Если входные требования слишком высоки (напр., «где описано сложение?», «что такое REPL?», «причём здесь ⊥?», «а как… ой, забыл»), я всегда не прочь их понизить, но для этого, разумеется, нужна читательская реакция (тут, там) — ведь всё не предусмотреть, для всех не написать.

И вообще предложения к освещению неосвещенного принимаются.

Кўайн на хаскеле

Как правило, я не умею писать их. И не считается, что Haskell — это какой-то тяжёлый язык для написания на нём кўайна. Но всё же приведу его:

module Main where magic s = s ++ show s main = putStrLn s s = magic "module Main where\nmagic s = s ++ show s\nmain = putStrLn s\ns = magic "

Для точности и красоты вывода в консоль файл должен заканчиваться пустой строкой.

Комментарии: сначала я думал написать magic так, чтобы она заменяла, скажем, '#' в своём аргументе s на show s, но в лени найти, где же такую замену недорого купить, решил, что пускай сама строка будет последней в файле. Это даже имеет какую-то неуловимую приятность.

Разумеется, вместо s ++ show s можно было бы написать какой-нибудь concatMap escape, убив сразу и зайца '#', но… (Заметьте, краткости я тоже не преследовал, иначе бы постарался сделать что-то типа такого: module Main where;m s=s++show s;main=putStrLn s;s=m"module Main where;m s=s++show s;main=putStrLn s;s=m".)

Пролог как бесперспективное заблуждение

Быть может, я недостаточно известен своей нелюбовью к прологу, нечёткой логике в двух ипостасях и ещё чему-то. Надо это подправить.

Читать далее Пролог как бесперспективное заблуждение

Фибоначчи, Haskell, O(log n)

(Внимание: дальше не написано ничего нового, но если вы не знаете о возведении в степень за \(O(\log n)\), можете чуть-чуть почитать.)

Не секрет, что числа Фибоначчи можно вычислить за экспоненциальное время, используя наивную рекурсию; за линейное время, используя более аккуратный способ; и даже за константное время, используя округление \(\frac{\phi^n}{\sqrt5}\) до ближайшего целого и скрещивая пальцы, что знаков хватит.

Так же не секрет, что, не используя floating point, можно обойтись и \(O(\log n)\) с помощью вычисления степени за \(O(\log n)\). Но всё равно опишу это.

Читать далее Фибоначчи, Haskell, O(log n)

Удивительное рядом

я: :type 1 2 3

GHCi: 1 2 3 :: forall t a a1. (Num a1, Num a, Num (a -> a1 -> t)) => t

Чудеса философии! Sm_rolleyes.svg

(В более человеческих терминах это будет так:

я: Расскажите, милейший, мне тип выражения «\(1\;2\;3\)», прошу вас!

GHCi: Пожалуйте. Да будет вам известно, тип его может быть любым \(\gamma\), необходимо только любым типам \(\alpha\) и \(\beta\) быть числовыми, и чтобы числовым был и \(\alpha\to\beta\to\gamma\), тип функций из \(\alpha\) и \(\beta\) в \(\gamma\).

Разумеется, это не так, и выполнить 1 2 3 не удастся… Sm_cry.svg

P. S. Со дня сего я более не именую на новые страницы, рубрики и теги латинским алфавитом ссылки.

P. P. S. Я забыл закрыть скобку. Закрою хотя бы здесь.)