juan_gandhi: (VP)
Juan-Carlos Gandhi ([personal profile] juan_gandhi) wrote2014-03-07 10:58 am
Entry tags:

the right stuff

presentation: http://2013.flatmap.no/blakstad.html
unfiltered library: https://github.com/unfiltered/unfiltered/blob/master/directives/README.markdown

So, the idea is, have all this http run monadic; that includes checking conditions and throwing back all those 404s, 451, 500...

[identity profile] mikkim08.livejournal.com 2014-03-08 11:22 am (UTC)(link)
Спасибо, очень интересно. Я тоже хочу писать как-нибудь вот так. Но есть вопросы:

Как я понял:

1) Result он что-то вроде Either. Это монадная обёртка для результат вычисления. Success это обёртка для успешно вычисленого значения, а Failure -- для кода ошибки.

2) Directive это монадная обёртка для функции HttpRequest => Result, похожая на монаду Reader.

Примеры Directives:

request = req:HttpRequest => Success(req)
method = request(req).map(_.method)
inputStream = request(req).map(_.inputStream)
и т.д.

Благодаря тому, что Result это монада, эти самые функции-"директивы" (Directive) можно "композировать" с помощью >=> , и это хорошо.

Теперь вопросы:

- Зачем нужно придумывать специальную монаду Result, если уже есть Either ?
- С какой целью Directive сам сделан монадой ?
- Если Directive это монада, то почему не использовать монаду Reader ?
Edited 2014-03-08 11:45 (UTC)

[identity profile] ivan-gandhi.livejournal.com 2014-03-08 04:16 pm (UTC)(link)
Я пробовал Either, но с ней как-то странно, она слишком симметрична; какая разница - левое, правое. А тут - как монада Exception.

Про Directive ничего не скажу, надо разбираться.

[identity profile] mikkim08.livejournal.com 2014-03-08 06:28 pm (UTC)(link)
Да, с Either не очень удобно. Может, в scalaz есть другой, более удобный, вариант ? Надо будет посмотреть. Но так или иначе, general-purpose Result в узкоспециальной библиотеке мне как-то не очень.

Про директивы есть другое видео : http://2013.flatmap.no/teigen.html

(может, с'ездить в мае на эту конференцию ? регистрация 2К стоит)
Edited 2014-03-08 18:29 (UTC)

[identity profile] ivan-gandhi.livejournal.com 2014-03-08 09:58 pm (UTC)(link)
В скалазеде есть Validation, но она непрактична.

[identity profile] mikkim08.livejournal.com 2014-03-09 03:12 pm (UTC)(link)
Может scala.util.Try тогда ? Хоть он и не монада. Я сейчас посмотрел, у нас пишут в таком стиле:
val handle: Response => Try[Value] = { resp =>
  ...
  for {
     - <- isOk(resp)  // returns Try
     - <- isJSON(resp) // returns Try
     result <- getResult(resp)
  } yield result
}
Edited 2014-03-09 15:16 (UTC)

[identity profile] ivan-gandhi.livejournal.com 2014-03-09 04:54 pm (UTC)(link)
Да, вот и я так хочу писать.