CookBook

Feb. 25th, 2009 11:50 am
lomeo: (иа)
Никак не могу привыкнуть, что на форуме CookBook программистского сайта RSDN рецепты блюд. Да, да, которые едят.
lomeo: (лямбда)
Понадобилось мне состояние, вычисление которого можно прервать в любой момент. Комбинатор guard не подходит тем, что его просто нет для State. if/then/else не устравает, потому что иногда прерывать необходимо в любом месте, например, в одной из вызываемой функции рекурсивной функции:
loop = do
    modify (+1)
    check
    loop

check = do
    s <- get
    if s == 42
        then interrupt
        else return ()

Вот как тут описать комбинатор interrupt?
Read more... )
lomeo: (иа)
Оказывается, цитирую
"сегодня в пят 13,в 23:31:30 GMT будет 1234567890 unix time :)"
lomeo: (гомер)
module Malkovich where

data Malkovich = Malkovich Malkovich Malkovich

malkovich = malkovich
    where
        malkovich = Malkovich malkovich malkovich

downcasting

Feb. 5th, 2009 12:15 pm
lomeo: (лямбда)
Downcasting - операция, как известо, опасная. К сожалению, совсем избавиться от неё нельзя1. Например, в случае, если мы работаем с колбэками, принимающими параметры, типы которых надо понизить в самих колбэках. Или вспомним обычный метод equals в Java.

Но, раз нельзя избавиться, то мы можем по крайней мере постараться снизить его опасность. Read more... )
lomeo: (лямбда)
На RSDN я очередной раз дискутировал с VladD2 и, кстати, для меня дискуссия получилась довольно полезной. Речь шла, в частности, и о Haskell. Один из необсуждённых (пока?) тезисов высказал VladD2:

Лично по мне так чем дальше инструмент от математического смысла, тем лучше.

Смысл в том, как я понял, что чем ближе инструмент "к математическому смыслу", тем дальше он от практического. Я с этим совершенно не согласен, однако быстро доказать его неправоту не могу. Поэтому попробую продемонстрировать практичность математического аппарата.

Read more... )
lomeo: (лямбда)
К чему я так подробно расписывал получение свёртки для розы? Очевидно, что интуитивно получить её можно сразу. Так я обычно и делаю, воспользовавшись методом размерностей, пардон, программированием "от типов". Возможно, так делаете и вы. Я хочу показать главный недостаток этого подхода - он неформален.

Read more... )

В данном конкретном случае нам очень сильно помогает Curry-Howard, но он не гарантирует уникальности доказательства (реализации), т.е. этот метод не формализуем. А вот на основе ТК, думаю, можно построить CataEval.
lomeo: (лямбда)
Когда я только разбирался с бананами, линзами и т.д. задача описания катаморфизма для розы:
data Rose a = Rose a [Rose a]

вызывала у меня большое затруднение.

Read more... )
lomeo: (иа)
Что то я в последнее время много пишу о Haskell и мало о жизни простых граждан. Вот картинка из блога Экслера.



Отсюда: http://exler.ru/blog/item/5768/?26
Там ещё до кучи: http://news.udaff.com/index.php?cat=pictures&news=1084

Ленин на даче похож на Буша.
lomeo: (лямбда)
3-й parsec, как известно, построен для работы с Data.ByteString, что должно неимоверно поднять скорость парсинга, по сравнению с обычным строковым.

Посмотрим, так ли это на самом деле )
lomeo: (лямбда)
Расширения типа fundep или MPTC обычно понятны бывают сразу, ну, по крайней мере, их идея. А вот чтобы разобраться с ошибками при инстанциировании класса, придётся разобраться.

Read more... )
lomeo: (лямбда)
Я вот жаловался [livejournal.com profile] thesz, что в Haskell нет аналога partial function в Scala, чтобы можно было легко строить конструкции аналогично Erlang'овского receive (я говорю о синтаксисе). Однако механизмы есть. Правда, я нашёл пока только для IO.

import Prelude hiding (catch)
import Control.Exception

e `patternFail` h = e `catch` \(PatternMatchFail _) -> h

apply handlers = \x -> foldl1 patternFail (map ($x) handlers)

-- *Main> apply [\[1]->putStrLn "a", \[2]->putStrLn "b", \[3]->putStrLn "c"] [2]
-- b


Список здесь всего лишь пример, можно сделать и по другому (varargs?)
lomeo: (лямбда)
Только недавно понял, что это то же самое, что и GADT:

data Z
data S n

data family List n a
data instance List Z a = Nil
data instance List (S n) a = Cons a (List n a)

--например
cadr :: List (S (S n)) a -> a
cadr (Cons _ (Cons x _)) = x


Только их ещё и расширять можно. Так что алгебраические типы данных, которые можно выписывать в разных модулях уже есть :-)
lomeo: (Default)
Ну что я могу сказать про ICFPC? За время контеста мой младший сын сменил состояние с "ползком" на "пешком".
lomeo: (Default)
Сегодня с сыном застряли в лифте. Но человек-паук нас спас.
lomeo: (лямбда)
Хаскель предлагает достаточно удобный для большинства задач уровень абстракции - алгебраические типы, сравнение с образцом, классы типов. Забираясь выше, легко попасть в ловушку не решения проблемы предметной области, не достижения цели, а решения проблемы отображения решения проблемы предметной области на фиксированный уровень абстракции и ни ангстремом ниже.

Здесь ([livejournal.com profile] thesz)
lomeo: (гомер)
Трурль и Клапауций опять спорят. Теперь уже о том, что называть функциональным языком.

Profile

lomeo: (Default)
Dmitry Antonyuk

December 2015

S M T W T F S
  12345
6789101112
131415 16171819
20212223242526
2728293031  

Syndicate

RSS Atom

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Sep. 24th, 2017 03:54 pm
Powered by Dreamwidth Studios