← All posts tagged Haskell

waterlaz
code Haskell
Ленивые вычисления + Y-комбинатор с мемоизацией = динамическое программирование (не совсем =)

y lim f = let a = listArray lim $ map g (range lim)
               g = f (a!)
           in (a!)

fib = y (1, 100) $ \f n -> if (n<=2) then 1 else (f (n-1)) + (f (n-2))
waterlaz
велосипеды сушка Haskell Недавно решил, что нужно улучшать performance на велосипеде и ради этого стоит похудеть^W сушиться. Написал^W навелосипедил (pun intended) простенький скрипт на хаскеле, который рисует симпатичный график изменения веса и всячески мотивирует.

waterlaz
спорт велосипеды Haskell Понял, что последнее время плохо понимаю треды на джуике про Haskell. А недавно не очень хорошо отспринтовал на треке. Решил исправить это дело и заказал штангу. Какие упражнения порекомендуют местные хаскелисты? Как оборудовать место для занятий дома, чтобы не пробить пол в случае чего?
waterlaz
Haskell Приятно видеть, что у acm.timus.ru дизайн такой же, как и 10 лет назад, когда я последний раз решал оттуда задачи.
Вдвойне приятно, что решения можно отправлять на хаскеле!
waterlaz
рамостроение Haskell Простой способ на коленке подогнать две трубы друг к другу — рассчитать и напечатать шаблон, как нужно вырезать конец одной из труб. Ни одну из найденных для этого программ мне заставить работать не удалось, пришлось писать свою.
kawais.mooo.com
В качестве параметров берет диаметры двух труб, угол между трубами, толщину стенок одной из труб и имя постскрипт файла, куда и выводится результат.
waterlaz
? Haskell Есть функция
pixmapNew :: DrawableClass d => Maybe d -> SomeCrap -> IO PIxmap
При попытке скомпилить код со строчкой
pm <- pixmapNew Nothing someCrap
вываливается ошибка, ведь компилятор не может вывести тип d.
Приходится писать так:
pm <- pixmapNew (Nothing :: Maybe Drawable) crap
хотя и Maybe Drawable тут не несет никакого смысла.
Это я что-то не понимаю, или это неудачная реализация биндингов в gtk2hs?
waterlaz
th Haskell Есть осмысленные книги, статьи, туториалы по template haskell?
Или почему не работает
let a = [| 1 |]
print $(a)
но работает
print $([| 1 |])
waterlaz
code NOOB Haskell
Пусть есть две функции State:
moveUp :: State (Integer, Integer) ()
moveUp = modify (\(x, y) -> (x, y+1))
и
callStupid :: State String ()
callStupid = modify (++ " sucks")

Как теперь реализовать функцию moveUpAndCallStupid :: State FunkyType ()
чтобы руками не разворачивать монады State и не собирать новые?
data FunkyData = Funky {
                name :: String,
                coordinates :: (Integer, Integer)
        }
waterlaz
code маразм Haskell
instance (Num a, Num b) => Num (a->b) where
    (+) f1 f2 = \x -> f1 x + f2 x
    (-) f1 f2 = \x -> f1 x - f2 x
    (*) f1 f2 = \x -> f1 x * f2 x
    abs f = \x -> abs $ f x
    signum f = \x -> signum $ f x
    fromInteger a = \x -> fromIntegral a
waterlaz
ноты музыка Haskell Когда-то давно мне было интересно узнать, откуда взялись ноты? Почему приятны звуки именно такой высоты, а не другой?

Первым же делом, два постулата.
Во-первых, две ноты, отличающихся по частоте в два раза — одна и та же нота.
Этому можно найти много объяснений, но оставлю в форме постулата.
Во-вторых, две ноты, отличающиеся по частоте в полтора раза, приятны как созвучие.
Такой интервал, кстати, называется квинта.

Так вот, начнем с какой-либо ноты. Возьмем струну длиной один метр и подвесим груз 1 кг.
Каждый раз будем увеличивать частоту в полтора раза, увеличивая груз в полтора раза.
Но если вес груза будет превышать 2кг, поделим его пополам.

Prelude> let cut x = if x>=2 then x/2 else x
Prelude> let f x = cut (1.5*x)

Проделаем такую операцию над первой нотой 12 раз и получим каких-то 13 звуков:

Prelude> let notes = take 13 $ iterate f 1
Prelude> notes
[1.0, 1.5, 1.125, 1.6875, 1.265625, 1.8984375, 1.423828125, 1.06787109375, 1.601806640625, 1.20135498046875, 1.802032470703125, 1.3515243530273438, 1.0136432647705078]

Все частоты ощутимо отличаются друг от друга, кроме первой и тринадцатой (1 и 1.0136).
Если продолжать увеличивать частоту в полтора раза и делить на два при необходимости,
то ноты будут повторяться с достаточно большой точностью.

Теперь если принять первую ноту с грузом 1 за до, то вот это и есть двенадцать нот(до, до#, ре, ре#, ...) в порядке возростания частоты:

Prelude Data.List> sort $ take 12 notes
[1.0, 1.06787109375, 1.125, 1.20135498046875, 1.265625, 1.3515243530273438, 1.423828125, 1.5, 1.601806640625, 1.6875, 1.802032470703125, 1.8984375]

Кстати, если взять первые 7 нот последовательности notes, то получится тональность соль мажор:

Prelude Data.List> let names = ["do", "do#", "re", "re#", "mi", "fa", "fa#", "sol", "sol#", "la", "la#", "si"]
Prelude Data.List> filter ((flip elem (take 7 notes)).fst) (zip (sort $ take 12 notes) names)
[(1.0,"do"), (1.125,"re"), (1.265625,"mi"), (1.423828125,"fa#"), (1.5,"sol"), (1.6875,"la"), (1.8984375,"si")]