ru_lambda: Товарищи, а что бы вы дописали / исправи

топ 100 блогов ru_lambda01.03.2010 Товарищи, а что бы вы дописали / исправили в этих классах ? Какие ещё минимальные функционалы для монад с приличной областью применения придумываются? Хочется собрать под себя консистентную библиотеку монадических трансформеров и потихоньку нарастить 'мясо', в первую очередь, библиотечку для внятного REPL'а и скриптования операций над файлами (свёртка жирных файлов плюс замена мэйку). Ну и всякие мечты ... Черновая реализация есть, сейчас всякие кросс-инстансы пишу.

{-# Language MultiParamTypeClasses,FunctionalDependencies #-}

module Control.Monad.Classes

where

import Data.Monoid



-- | class for monad transformer itself

class MonadTrans t where

 lift :: Monad m => m a -> t m a



-- | class for monads , that allows io

class Monad m => MonadIO m where

 liftIO :: IO a -> m a



-- | IO monad allows io ^_^

instance MonadIO IO where

 liftIO = id



-- | class for monads that accumulates some results in internal state

class (Monad m,Monoid w) => MonadAccum m w|-> w where

-- | one more value to be accumulated

 accum  :: w -> m ()

-- ignore values from specific piece of code

 ignore :: m () -> m ()

-- todo:  par:: [m ()] -> m ()



-- | class for continuation monad. useful for complex control flow

class Monad m => MonadCont m r | m -> r where

 -- | return immidiatly. escapes the whole tail

 exit :: r -> m a

 -- | a kind of local escape mechanism.

 callCC :: ((a -> m b) -> m a) -> m a



-- | class for error handling.

class Monad m => MonadError m e | m -> e where

 -- | handle errors from some piece of code

 catching :: (e -> m a) -> m a -> m a

 -- | signal an error. skip all folloing actions until error is catched

 throw    ::  e -> m a



-- | class for monads, that processes some array of data and returns some value

class Monad m => MonadProc m r p | m -> p, m -> r where

 -- | try to get next value. if no next value, execute specific action

 next :: m r -> m p 



-- | class for query's . It's a kind of ListT.

class Monad m => MonadQuery m where

 -- combine values from some queries.

 qapp :: m a -> m a -> m a

 -- mark this line of query as fail and stop processing it

 stop :: m a



-- | class for read-only state. does allow local monad filtering of state.

class Monad m => MonadReader m v | m -> v where

 -- | query environment

 ask :: m v

 -- | modify environment for some action

 local :: v -> m a -> m a



-- | class for mutable state

class Monad m => MonadState m s | m -> s where

-- take state

 get :: m s

-- put state

 put :: s -> m ()



-- | class for writer monad. showld be used for loggers.

class (Monad m) => MonadWrite m w | m -> w where

 -- | write some output

 tell :: w -> m ()

 -- | skip some output

 skip :: m a -> m a

Оставить комментарий

Архив записей в блогах:
"Нанял у застройщика две комнаты в подвале маленького домика в садике. Службу в музее бросил и начал сочинять роман о Понтии Пилате. — совершенно отдельная квартирка, и еще передняя, и в ней раковина с водой, — почему-то особенно  горделиво подчеркнул  он, — маленькие ...
Прошло 7 дней, как я юзаю ЭТО. Не могу не положить в анналы и не вынести на ваше обсуждение впечатления от езды на этом монстре. 555 л/с 680 Нм 4.7с до 100 км/ч 2400 кг веса И буря эмоций. Для начала - посмотрите, какой красавец. Начнем с салона. ...
Играла я с детьми в настолку «Игра престолов». Игра с приложением на восемь человек, нас четверо. Так что у каждого игрока кроме своего государства было вассальное.  Сначала играли по правилу, что у каждого игрока вассал всю игру один и тот же, не меняется. При таких вводных ...
Воскресенье, дык мало того- сегодня ещё и мой профессиональный праздник. Но, невзирая на это, он у меня рабочий, да к тому же какой то суетной. Собственно нынешняя работа много времени не занимает. А вот околорабочего пиздежа было полдня. От телефона аж ухо болит и голос сел. По большей ...
"Объявление: лечу любую форму геммороя - методом куниллунгуса в период месячных. ...