lomeo: (лямбда)
Допустим у нас есть тип (X a), где X ::= T x y z ... Тут важно, что "a" последнее.
Тогда если "a" хотя бы в одном конструкторе данных стоит слева от стрелки, то этот тип нельзя сделать функтором (instance Functor) так, чтобы соблюдались законы над функторами, нес па?
lomeo: (лямбда)
Для equational reasoning в Haskell можно (иногда нужно) пользоваться GHC Rules (На Haskellwiki), чтобы написанное было читабельным и maintainable, а скомпилированное эффективным. А для нахождения нужных правил можно воспользоваться Theorem for Free. Например, его автоматической выводилкой. Или использовать free / ft команды lambdabot-а.

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

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

Это вообще возможно? А то у меня каша в голове.
lomeo: (лямбда)
На RSDN технические работы.

ExpandRead more... )

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

P.P.S. А ещё я подумал, что изобрёл слово "индексикация" как перевод indexitis (болезнь использования (!!) в Haskell), а оно оказывается существует реально и означает совсем-совсем другое :-(
lomeo: (лямбда)
Читал статью 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 в статье.

ExpandПодглядеть )
lomeo: (лямбда)
Вот здесь у меня висит на выводе типа myFix:

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


Запускал в GHCi 6.6

nub

Mar. 19th, 2007 12:11 pm
lomeo: (гомер)
Вот есть такая функция для удаления дублей из списка - nub. Название совершенно дурацкое. Я ещё когда про неё не знал, искал что нибудь вроде uniq или там removeDups в стандартных библиотеках.

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

Пока всё на сегодня.
lomeo: (лямбда)
Сегодня читал в ru_declarative вопрос и уже на предложении

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

понял, что человек спрашивает про sequence. Штампы, однако!.. Ну, или темплейты там, паттерны...
lomeo: (лямбда)
Когда мы пишем монадическую функцию с хвостовой рекурсией, то явно эта функция не хвостато-рекурсивная:

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


Expandчуть-чуть кода и много вопросов )
lomeo: (лямбда)
Паттерн-матчинг в Haskell всё наворачивают.

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

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


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

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


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

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


Подчерк как повторение имени функции здесь условность, можно придумать что нибудь другое.
Это неважно.
lomeo: (лямбда)
Наконец то! SPJ предлагает добавить views patterns в Haskell'.

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

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

Expandчуть подробнее )

StateUndo

Jan. 16th, 2007 04:42 pm
lomeo: (лямбда)
Состояние, позволяющее откатывать изменения, легко реализуется поверх уже имеющегося типа данных Control.Monad.State.State.
ExpandНемножко кода )

deriving

Jan. 12th, 2007 05:51 pm
lomeo: (лямбда)
Неожиданно обнаружил, что при включенном -fglasgow-exts для newtype можно делать deriving любых классов, экземпляром которого уже является обернутый тип.

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

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

UPD: Читайте ещё извращений про deriving. На моём 6.4.2 не работают.
UPD 2: А вот и описание этой фичи.
lomeo: (лямбда)
У [livejournal.com profile] _darkus_ я чуть чуть порасписывал двусвязные списки. Мне понравилось решение к которому я пришёл. Хотя у Окасаки наверняка уже есть что то подобное.
lomeo: (лямбда)
Хорошая статья про монад-трансформеры для тех, кто ещё не понимает как с ними работать:
Monad transformers step-by-step
lomeo: (лямбда)
Из типа функции foo :: a -> a следует её реализация: foo a = a. Однако, это не совсем верно.
Кто первый предложит ещё одну реализацию?
lomeo: (лямбда)
Оказывается, есть и такая вещь в Хаскеле. Существует как расширение системы типов, есть ограничения, пользы большой не вижу, но пусть будет.

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

Пример

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

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


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

Смотреть здесь
lomeo: (лямбда)
Только сейчас сообразил, что это одно и то же для ВСЕХ монад.
До сих пор думал, что они совпадают у 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 много классов могут зависеть.

Profile

lomeo: (Default)
Dmitry Antonyuk

April 2024

S M T W T F S
 123456
7891011 1213
14151617181920
21222324252627
282930    

Syndicate

RSS Atom

Most Popular Tags

Style Credit

Expand Cut Tags

Expand All Cut TagsCollapse All Cut Tags
Page generated Jul. 4th, 2025 04:31 am
Powered by Dreamwidth Studios