Для equational reasoning в Haskell можно (иногда нужно) пользоваться GHC Rules (На Haskellwiki), чтобы написанное было читабельным и maintainable, а скомпилированное эффективным. А для нахождения нужных правил можно воспользоваться Theorem for Free. Например, его автоматической выводилкой. Или использовать free / ft команды lambdabot-а.
К сожалению, что нибудь более-менее автоматического для типов, отличных от стандартных, я найти не могу. Остаётся или выводить правила руками, или строить по аналогии со стандартными, а затем проверять на корректность.
Это я всё мечтаю. Нарисовал нужные типы данных, сформировал по ним типы функций для работы над ними, автоматически построил их реализацию, автоматически построил правила, выбрал нужные для оптимизации. А дальше работаешь легко и непринуждённо. Это идеал, разумеется. Но я уверен, что частично эту работу можно автоматизировать. Типа того, что при доказательстве Coq'ом ему надо указывать стратегии, так же и здесь при реализации тела функции надо направлять "думатель".
Это вообще возможно? А то у меня каша в голове.
К сожалению, что нибудь более-менее автоматического для типов, отличных от стандартных, я найти не могу. Остаётся или выводить правила руками, или строить по аналогии со стандартными, а затем проверять на корректность.
Это я всё мечтаю. Нарисовал нужные типы данных, сформировал по ним типы функций для работы над ними, автоматически построил их реализацию, автоматически построил правила, выбрал нужные для оптимизации. А дальше работаешь легко и непринуждённо. Это идеал, разумеется. Но я уверен, что частично эту работу можно автоматизировать. Типа того, что при доказательстве Coq'ом ему надо указывать стратегии, так же и здесь при реализации тела функции надо направлять "думатель".
Это вообще возможно? А то у меня каша в голове.
Опять про паттерн матчинг
Jun. 18th, 2007 05:13 pmНа RSDN технические работы.
( Read more... )
P.S. А ещё я сегодня видел в метро парня, читавшего распечатку "Знакомство с языком Haskell" или что то в этом духе ;-)
P.P.S. А ещё я подумал, что изобрёл слово "индексикация" как перевод indexitis (болезнь использования (!!) в Haskell), а оно оказывается существует реально и означает совсем-совсем другое :-(
P.S. А ещё я сегодня видел в метро парня, читавшего распечатку "Знакомство с языком Haskell" или что то в этом духе ;-)
P.P.S. А ещё я подумал, что изобрёл слово "индексикация" как перевод indexitis (болезнь использования (!!) в Haskell), а оно оказывается существует реально и означает совсем-совсем другое :-(
Задачка со свёрткой
May. 21st, 2007 03:58 pmЧитал статью Bernie Pope "Getting a Fix from the Right Fold" из The Monad. Reader Issue 6. В ней решается задачка о написании
У меня удивительно быстро получилось решить эту задачку. Решение было эквивалентным решению 2 в статье.
( Подглядеть )
dropWhile
через foldr
. В частности, эта задачка решалась в Graham Hutton "A Tutorial on the Universality and Expressiveness of Fold" через таплы.У меня удивительно быстро получилось решить эту задачку. Решение было эквивалентным решению 2 в статье.
Вот есть такая функция для удаления дублей из списка -
Так вот, сегодня заметил: если повернуть каждую букву по часовой стрелке (для левшей - против часовой) на 180°, то название превратится в
Пока всё на сегодня.
nub
. Название совершенно дурацкое. Я ещё когда про неё не знал, искал что нибудь вроде uniq
или там removeDups
в стандартных библиотеках.Так вот, сегодня заметил: если повернуть каждую букву по часовой стрелке (для левшей - против часовой) на 180°, то название превратится в
unq
.Пока всё на сегодня.
ах! какой я умный!
Feb. 26th, 2007 06:05 pmСегодня читал в ru_declarative вопрос и уже на предложении
Можно ли ещё более "закомпрехенсить" list comprehensions?
понял, что человек спрашивает про sequence. Штампы, однако!.. Ну, или темплейты там, паттерны...
Можно ли ещё более "закомпрехенсить" list comprehensions?
понял, что человек спрашивает про sequence. Штампы, однако!.. Ну, или темплейты там, паттерны...
A History of Haskell
Jan. 25th, 2007 03:27 pmСабж завершен по заверениям SPJ.
Качайте, там много картинок!
Качайте, там много картинок!
хвостато-рекурсивные функции в монадах
Jan. 24th, 2007 07:54 pmКогда мы пишем монадическую функцию с хвостовой рекурсией, то явно эта функция не хвостато-рекурсивная:
( чуть-чуть кода и много вопросов )
loop = do
cmd <- getLine
if (cmd == ":q")
then return ()
else loop
Паттерн-матчинг в Haskell всё наворачивают.
А вот почему не сделают как в Прологе - если два идентификатора в паттерне совпадают, значит по этим позициям должны быть равные значения.
аналогично более сложному
И ещё! Не нравится мне, что при использовании многострочном объявлении функции приходится писать её название несколько раз.
А как было бы чудесно (объединяя оба примера)
Подчерк как повторение имени функции здесь условность, можно придумать что нибудь другое.
Это неважно.
А вот почему не сделают как в Прологе - если два идентификатора в паттерне совпадают, значит по этим позициям должны быть равные значения.
isDup (x:x:_) = True
isDup _ = False
аналогично более сложному
isDup (x:y:_) | x == y = True
isDup _ = False
И ещё! Не нравится мне, что при использовании многострочном объявлении функции приходится писать её название несколько раз.
А как было бы чудесно (объединяя оба примера)
isDup (x:x:_) = True
_ _ = False
Подчерк как повторение имени функции здесь условность, можно придумать что нибудь другое.
Это неважно.
View patterns
Jan. 23rd, 2007 01:20 pmНаконец то! SPJ предлагает добавить views patterns в Haskell'.
Views patterns - это не совсем views, вернее, совсем не views :-) Это, скорее, другая форма записи pattern guards - более легкая и почти элегантная ;-) Здесь SPJ ещё в далёком 97-м рассматривал pattern guards как альтернативу views.
Мой интерес к views растёт с одной задачи, которую рассматривали мы с
thesz. Ниже я описал pattern guards как раз на её примере.
( чуть подробнее )
Views patterns - это не совсем views, вернее, совсем не views :-) Это, скорее, другая форма записи pattern guards - более легкая и почти элегантная ;-) Здесь SPJ ещё в далёком 97-м рассматривал pattern guards как альтернативу views.
Мой интерес к views растёт с одной задачи, которую рассматривали мы с
![[livejournal.com profile]](https://www.dreamwidth.org/img/external/lj-userinfo.gif)
Состояние, позволяющее откатывать изменения, легко реализуется поверх уже имеющегося типа данных
( Немножко кода )
Control.Monad.State.State
.Неожиданно обнаружил, что при включенном -fglasgow-exts для
А я дурак сижу пишу инстансы.
UPD: Читайте ещё извращений про deriving. На моём 6.4.2 не работают.
UPD 2: А вот и описание этой фичи.
newtype
можно делать deriving
любых классов, экземпляром которого уже является обернутый тип.
newtype Stream a = S [a]
deriving (Functor, Monad, Show)
А я дурак сижу пишу инстансы.
UPD: Читайте ещё извращений про deriving. На моём 6.4.2 не работают.
UPD 2: А вот и описание этой фичи.
Двусвязные списки
Dec. 12th, 2006 02:50 pmУ
_darkus_ я чуть чуть порасписывал двусвязные списки. Мне понравилось решение к которому я пришёл. Хотя у Окасаки наверняка уже есть что то подобное.
![[livejournal.com profile]](https://www.dreamwidth.org/img/external/lj-userinfo.gif)
Про трансформеры
Dec. 4th, 2006 07:13 pmХорошая статья про монад-трансформеры для тех, кто ещё не понимает как с ними работать:
Monad transformers step-by-step
Monad transformers step-by-step
Dynamic scoping в Haskell
Oct. 30th, 2006 02:22 pmОказывается, есть и такая вещь в Хаскеле. Существует как расширение системы типов, есть ограничения, пользы большой не вижу, но пусть будет.
При dynamic scoping за связывание переменной отвечает вызывающий код, а не вызываемый.
Пример
( то же самое на Haskell )
При dynamic scoping за связывание переменной отвечает вызывающий код, а не вызываемый.
Пример
function foo()
{
print x; // x имеет динамическую область видимости.
}
function bar()
{
var x = 5;
foo(); // вот здесь x и привяжется.
}
Эффективная перестановка в Хаскеле
Jul. 27th, 2006 12:02 pmВ Haskell мэйллисте парень показывает как из неэффективной, но интуитивно понятной реализации перестановки сделать эффективную и всё так же красиво выглядящую. Люблю чистый код.
Смотреть здесь
Смотреть здесь
fmap = liftM
Jul. 14th, 2006 06:05 pmТолько сейчас сообразил, что это одно и то же для ВСЕХ монад.
До сих пор думал, что они совпадают у IO и списка.
А вот дефолтную реализацию метода класса, от которого зависит определяемый класс, нельзя описать. А то можно было бы
Ну и хорошо, что нельзя. А то от Functor много классов могут зависеть.
До сих пор думал, что они совпадают у 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 много классов могут зависеть.