↑↑↓↓←→←→ⒷⒶ Войти !bnw Сегодня Клубы
Привет, TbI — HRWKA! 1239.0 пользователей не могут ошибаться!
?6942
прекрасное6443
говно5905
говнорашка5512
хуита4716
anime3066
linux2652
music2635
bnw2602
рашка2565
log2354
ололо2174
дунч1832
pic1815
сталирасты1491
украина1439
быдло1437
bnw_ppl1419
дыбр1238
гімно1158

Драйвер редиса возвращает Redis (Either Reply a). При операции HGET возвращает, соответственно, Redis (Either Reply (Maybe ByteString)), типа значения по ключу может и не быть. Программист для упрощения пишет сначала специальную функцию redis', которая заворачивает ответ редиса в EitherT-based монаду, чтоб соединять подобные вычисления и возвращать первую неудачу:

newtype Redis' a = Redis' (EitherT Redis.Reply Redis.Redis a) deriving (MonadIO)
instance Monad Redis' where
    return = Redis' . EitherT . return . Right
    (Redis' m) >>= f = Redis' $ m >>= \rv -> unwrapRedis' $ f rv
redis' = Redis' . EitherT

Таким образом, теперь, если вы получаете ответ Redis (Either Reply a), вы его преобразуете в

Redis' (EitherT Reply Redis a)

и можете соединять подобные вычисления в do-блоке типа:

do
    res <- redis' $ Redis.hget foo bar
    res2 <- redis' $ Redis.hget baz zab

и вычисление остановится на первом возврате ошибки.

Далее. Программисту необходимо по кучке значений сделать HGET и вернуть это как-то внутри кортежа, поскольку мы внутри новой монады Redis' -- завернуть результат в неё. В случае, если значения хоть по одному ключу не существует, хочется вернуть Nothing для всех. Потому создаётся новая монада:

newtype HashFields a = HashFields (MaybeT Redis' a)
    deriving (Functor, Monad)
instance Applicative HashFields where
    pure = return
    (<*>) = ap

описывающая вычисления типа Redis', которые могут вернуть неудачу. Пишется новая функция

hashField = HashFields . MaybeT . redis'

способная завернуть результат неудачи в новую монаду, которая умеет останавливаться на первой неудаче. Также пишется специальная функция для HGET:

getField :: ByteString -- ^ Key
         -> ByteString -- ^ Hash field name
         -> HashFields String
getField key field = fmap toString $ hashField $ Redis.hget key field

Также напишем функцию, которая "запустит" наше вычисление:

getRedisFields :: forall a. HashFields a -> Redis' (Maybe a)
getRedisFields (HashFields f) = runMaybeT f

И теперь лёгким движением руки мы можем сделать что-то вроде:

getRedisFields ((,,,,,) <$>
    getField k "foo" <*>
    getField k "bar" <*>
    getField k "baz" <*>
    getField k "zab" <*>
    getField k "rab" <*>
    getField k "oof")

Вопрос: вам не кажется это "слишком"? Я пока еще не настолько просто манипулирую типами в голове, чтоб ощутить всю ситуацию, хорошо хоть в целом могу медленно прости по шагам по коду, но есть ощущение, что что-то здесь не так.

#DEENSA (6+1) / @kb / 4036 дней назад

Котаны, а есть какой транспорт, через который можно подписаться на жжшные треды в жабир? Чтобы в тупичке на матчпчто подписался и палишь в жабире все, а не f5 тыкаешь

#FAQUJ4 (0+1) / @vostrik / 4037 дней назад

Сходил вместе с старыми друзьяшками в пэйнтбол. Все по милитари http://i.imgur.com/CLkjY9o.jpg. Но некотрые моменты понравились.

#RZHSUE (0) / @sphagnum / 4040 дней назад

В перерыве между работой и прокрастинацией пытаюсь распаковать прошивку для d-link dir-615 ревизии М1, для которой ddwrt так и не сделали

#52X0PT (0) / @hongweibing / 4047 дней назад

Мамка послала купить картошку, одевал носки, солнечная погода обернулась снегом с дождём и градом и ещё одиню

#B5O669 (2) / @sphagnum / 4055 дней назад

Perl умеет ждать.

#FRPLHE (0) / @sphagnum / 4058 дней назад

Пишу тонну factory-бойлерплейта, но понимаю, что читающий может быть слишком шокирован, потому заставляю себя "пока-что-ненужные" вещи писать напрямую. Possible-cultural-misunderstanding-driven development.

#HJH51G (26) / @kb / 4059 дней назад

Красивая осень. Надо будет не полениться в воскресенье и създить за город.

#9GIFPZ (0) / @sphagnum / 4070 дней назад

Неделя назад. Экзистенциальные кризисы, забухал, поиск девушки за деньги, ДС2, перелом лица @ забрали $, а вчера ЛОРушка дочинил всё. Во вторник снова на быдло-работу. Вопрос (борды 200): есть ли что-нибудь готовое для мониторинга тредов, что бы можно было достать последнюю версию до перехода за стикс?

#774SBQ (0) / @sphagnum / 4076 дней назад

Не нужно, конечно, но новый папа доставляет http://www.bbc.co.uk/russian/society/2013/09/130919_pope_francis_interview.shtml. Это как браться за рефакторинг того, чего все боятся трогать и продолжают привинчивать костыли.

#1M43EU (1+1) / @sphagnum / 4085 дней назад

Парилка при качалке превращается в увлекательно национальное увеселение "терпеть". Не выходить же раньше, тех кто пришёл до тебя. Не выходить же, когда накидали.

#63IF4B (4) / @sphagnum / 4086 дней назад

Обнаружен ЖЖ артемия лебедева: http://tema.livejournal.com/1468670.html#comments

#T20M0S (0) / @goren / 4128 дней назад

Путен и ОМОН теперь стали символами гей-парадов: http://efa2007.livejournal.com/631534.html

#TJXU17 (1+3) / @goren / 4130 дней назад

http://lubimets-bogov.livejournal.com/3373891.html That's hilarious on so many levels…

#93NLPK (1) / @goren / 4130 дней назад

Я тут уже, кажется, писал, что женщины в принципе во многих облатях мыслят рациональнее, чем мужчины. Например в вопросах любви мужчина руководствуется только бурными и неконтролируемыми эмоциями, на которые он совершенно не может повлиять. В то же время женщины действуют по строго просчитанному и рациональному алгоритму: http://ace1962.livejournal.com/1331857.html Есть чему поучиться, ага.

#ZP53X9 (12+2) / @goren / 4131 день назад

Какой чудный малыш... http://pryf.livejournal.com/3222931.html

#URBQ2U (0+1) / @balaklava / 4150 дней назад

Аргументы противников легализации оружия: http://lj.rossia.org/users/boza/583358.html

#2OU6R1 (28+1) / @goren / 4232 дня назад

Комментарии немцев о путене: http://fish12a.livejournal.com/558224.html

Не могли бы русские одолжить нам Путина? Нам в Германии нужны политики с твёрдым характером.

Ну что, русские, как вы? Одолжите? Может быть, от широты русской души и насовсем им подарить, чего для братушек-немцев-то жалеть?

#7NE9O5 (7+2) / @goren / 4246 дней назад

http://lj.rossia.org/users/mor77/438053.html#cutid1
Годная жежешечка, культурная. И фон зелененький, как я люблю.

#D466TW (2) / @plhk / 4276 дней назад
--
ipv6 ready BnW для ведрофона BnW на Реформале Викивач Котятки

Цоперайт © 2010-2016 @stiletto.