lomeo: (лямбда)
2007-07-12 12:51 pm
Entry tags:

Опять про Monadability

Допустим у нас есть тип (X a), где X ::= T x y z ... Тут важно, что "a" последнее.
Тогда если "a" хотя бы в одном конструкторе данных стоит слева от стрелки, то этот тип нельзя сделать функтором (instance Functor) так, чтобы соблюдались законы над функторами, нес па?
lomeo: (лямбда)
2007-07-04 06:57 pm

Кстати!

Для equational reasoning в Haskell можно (иногда нужно) пользоваться GHC Rules (На Haskellwiki), чтобы написанное было читабельным и maintainable, а скомпилированное эффективным. А для нахождения нужных правил можно воспользоваться Theorem for Free. Например, его автоматической выводилкой. Или использовать free / ft команды lambdabot-а.

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

Это я всё мечтаю. Нарисовал нужные типы данных, сформировал по ним типы функций для работы над ними, автоматически построил их реализацию, автоматически построил правила, выбрал нужные для оптимизации. А дальше работаешь легко и непринуждённо. Это идеал, разумеется. Но я уверен, что частично эту работу можно автоматизировать. Типа того, что при доказательстве Coq'ом ему надо указывать стратегии, так же и здесь при реализации тела функции надо направлять "думатель".

Это вообще возможно? А то у меня каша в голове.
lomeo: (лямбда)
2007-06-18 05:13 pm

Опять про паттерн матчинг

На RSDN технические работы.

Read more... )

P.S. А ещё я сегодня видел в метро парня, читавшего распечатку "Знакомство с языком Haskell" или что то в этом духе ;-)

P.P.S. А ещё я подумал, что изобрёл слово "индексикация" как перевод indexitis (болезнь использования (!!) в Haskell), а оно оказывается существует реально и означает совсем-совсем другое :-(
lomeo: (лямбда)
2007-05-21 03:58 pm

Задачка со свёрткой

Читал статью Bernie Pope "Getting a Fix from the Right Fold" из The Monad. Reader Issue 6. В ней решается задачка о написании dropWhile через foldr. В частности, эта задачка решалась в Graham Hutton "A Tutorial on the Universality and Expressiveness of Fold" через таплы.

У меня удивительно быстро получилось решить эту задачку. Решение было эквивалентным решению 2 в статье.

Подглядеть )
lomeo: (лямбда)
2007-04-10 02:31 pm

Вывод типов всегда завершается, говорите?

Вот здесь у меня висит на выводе типа myFix:

newtype Fun a = Fun (Fun a -> a)
 
fun x@(Fun f) = f x
 
myFix = fun (Fun fun)


Запускал в GHCi 6.6
lomeo: (гомер)
2007-03-19 12:11 pm

nub

Вот есть такая функция для удаления дублей из списка - nub. Название совершенно дурацкое. Я ещё когда про неё не знал, искал что нибудь вроде uniq или там removeDups в стандартных библиотеках.

Так вот, сегодня заметил: если повернуть каждую букву по часовой стрелке (для левшей - против часовой) на 180°, то название превратится в unq.

Пока всё на сегодня.
lomeo: (лямбда)
2007-02-26 06:05 pm

ах! какой я умный!

Сегодня читал в ru_declarative вопрос и уже на предложении

Можно ли ещё более "закомпрехенсить" list comprehensions?

понял, что человек спрашивает про sequence. Штампы, однако!.. Ну, или темплейты там, паттерны...
lomeo: (лямбда)
2007-01-25 03:27 pm
Entry tags:

A History of Haskell

Сабж завершен по заверениям SPJ.
Качайте, там много картинок!
lomeo: (лямбда)
2007-01-24 07:54 pm

хвостато-рекурсивные функции в монадах

Когда мы пишем монадическую функцию с хвостовой рекурсией, то явно эта функция не хвостато-рекурсивная:

loop = do
    cmd <- getLine
    if (cmd == ":q")
        then return ()
        else loop


чуть-чуть кода и много вопросов )
lomeo: (лямбда)
2007-01-24 07:30 pm

хотелки

Паттерн-матчинг в Haskell всё наворачивают.

А вот почему не сделают как в Прологе - если два идентификатора в паттерне совпадают, значит по этим позициям должны быть равные значения.

isDup (x:x:_) = True
isDup _       = False


аналогично более сложному

isDup (x:y:_) | x == y = True
isDup _                = False


И ещё! Не нравится мне, что при использовании многострочном объявлении функции приходится писать её название несколько раз.
А как было бы чудесно (объединяя оба примера)

isDup (x:x:_) = True
_     _       = False


Подчерк как повторение имени функции здесь условность, можно придумать что нибудь другое.
Это неважно.
lomeo: (лямбда)
2007-01-23 01:20 pm

View patterns

Наконец то! SPJ предлагает добавить views patterns в Haskell'.

Views patterns - это не совсем views, вернее, совсем не views :-) Это, скорее, другая форма записи pattern guards - более легкая и почти элегантная ;-) Здесь SPJ ещё в далёком 97-м рассматривал pattern guards как альтернативу views.

Мой интерес к views растёт с одной задачи, которую рассматривали мы с [livejournal.com profile] thesz. Ниже я описал pattern guards как раз на её примере.

чуть подробнее )
lomeo: (лямбда)
2007-01-16 04:42 pm

StateUndo

Состояние, позволяющее откатывать изменения, легко реализуется поверх уже имеющегося типа данных Control.Monad.State.State.
Немножко кода )
lomeo: (лямбда)
2007-01-12 05:51 pm

deriving

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

newtype Stream a = S [a]
    deriving (Functor, Monad, Show)

А я дурак сижу пишу инстансы.

UPD: Читайте ещё извращений про deriving. На моём 6.4.2 не работают.
UPD 2: А вот и описание этой фичи.
lomeo: (лямбда)
2006-12-12 02:50 pm

Двусвязные списки

У [livejournal.com profile] _darkus_ я чуть чуть порасписывал двусвязные списки. Мне понравилось решение к которому я пришёл. Хотя у Окасаки наверняка уже есть что то подобное.
lomeo: (лямбда)
2006-12-04 07:13 pm

Про трансформеры

Хорошая статья про монад-трансформеры для тех, кто ещё не понимает как с ними работать:
Monad transformers step-by-step
lomeo: (лямбда)
2006-11-06 02:53 pm

задачка

Из типа функции foo :: a -> a следует её реализация: foo a = a. Однако, это не совсем верно.
Кто первый предложит ещё одну реализацию?
lomeo: (лямбда)
2006-10-30 02:22 pm

Dynamic scoping в Haskell

Оказывается, есть и такая вещь в Хаскеле. Существует как расширение системы типов, есть ограничения, пользы большой не вижу, но пусть будет.

При dynamic scoping за связывание переменной отвечает вызывающий код, а не вызываемый.

Пример

function foo()
{
    print x; // x имеет динамическую область видимости.
}

function bar()
{
    var x = 5;
    foo(); // вот здесь x и привяжется.
}


то же самое на Haskell )
lomeo: (лямбда)
2006-07-27 12:02 pm

Эффективная перестановка в Хаскеле

В Haskell мэйллисте парень показывает как из неэффективной, но интуитивно понятной реализации перестановки сделать эффективную и всё так же красиво выглядящую. Люблю чистый код.

Смотреть здесь
lomeo: (лямбда)
2006-07-14 06:05 pm

fmap = liftM

Только сейчас сообразил, что это одно и то же для ВСЕХ монад.
До сих пор думал, что они совпадают у IO и списка.

А вот дефолтную реализацию метода класса, от которого зависит определяемый класс, нельзя описать. А то можно было бы

class Functor m => Monad m where
    return :: m a
    (>>=) :: m a -> (a -> m b) -> m b

    instance Functor m where
        fmap f m = m >>= (return . f)


Ну и хорошо, что нельзя. А то от Functor много классов могут зависеть.