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: (лямбда)
На RSDN технические работы.

Read 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 в статье.

Подглядеть )
lomeo: (лямбда)
Недавно на LTU проходила ссылка на Functional Pearls. Наконец то я до неё добрался и начал читать Richard Bird. How to Write a Functional Pearl. Понравившиеся, по исключительно субъективным причинам, моменты:

В одном из советов о том, как писать, Bird пишет: "Find an author whose style you admire and copy it (my personal favourites are Martin Gardner and Don Knuth).". Порадовало, собственно, наличие Мартина Гарднера в образцах подражания.

Во-вторых )
lomeo: (лямбда)
Паттерн-матчинг в Haskell всё наворачивают.

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

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


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

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


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

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


Подчерк как повторение имени функции здесь условность, можно придумать что нибудь другое.
Это неважно.

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 Jul. 22nd, 2017 04:34 am
Powered by Dreamwidth Studios