juan_gandhi: (VP)
[personal profile] juan_gandhi
so, can you write in Scala a web server using state monad, without any variable? :)
Kind of inverts your perception of what controls what, but who cares. It's just an FSM.

Is not it a nice exercise? :)

Date: 2014-07-12 02:25 am (UTC)
From: [identity profile] badula.livejournal.com
about as nice and useful as biting your own toenails.
what is the expected outcome? one lifting weights gains muscle mass, one writing monads for the sake of writing monads achieves what?
may be entertaining though for the first few minutes.

Date: 2014-07-12 03:21 am (UTC)
From: [identity profile] ivan-gandhi.livejournal.com
Can you bite your toes? I believe it is a good exercise too. Good for your health.

This one is good for your mental health.

Date: 2014-07-12 03:47 am (UTC)
From: [identity profile] cema.livejournal.com
Or vice versa...

Date: 2014-07-12 03:38 am (UTC)
From: [identity profile] gds.livejournal.com
у меня на ocaml + iteratees вебсервер написан как раз без переменных (за исключением буферов в enumerator). И даже state monad не пригодилась -- не нужна и всё тут. Да и не получилось бы там использовать переменные -- итераты ограничивают.

Date: 2014-07-12 03:41 am (UTC)
From: [identity profile] ivan-gandhi.livejournal.com
Хм, не понял - а где состояние хранится? Это ж всяко стейт машина.

Date: 2014-07-12 03:55 am (UTC)
From: [identity profile] gds.livejournal.com
стейт машина есть, но неявно. Там lightweight threads, и с точки зрения деталей реализации состояние хранится в окружении замыканий, которые обслуживают клиентов (библиотека, дающая треды, абстрагирует этот вопрос; дана thread monad, чем-то похожая на IO monad). С точки зрения кода состояние хранится в аргументах функций и в let-in привязках (они иммутабельны).

Date: 2014-07-12 04:37 am (UTC)
From: [identity profile] ivan-gandhi.livejournal.com
Я пока не ощущаю, чем бы это отличалось от переменных.

Date: 2014-07-12 04:48 am (UTC)
From: [identity profile] gds.livejournal.com
отличается тем, что изменяемых переменных нет. Можно рассматривать это как стейт машину, реализованную на обычных функциях.

Date: 2014-07-12 05:04 am (UTC)
From: [identity profile] ivan-gandhi.livejournal.com
Не скажу, чтобы понял, как это выглядит в коде.
Можно какой-нибудь микрообразец?

Date: 2014-07-12 05:37 am (UTC)
From: [identity profile] gds.livejournal.com
https://bitbucket.org/gds/amall/src/743786ee566009113b954db093116e56e4e5b17e/src/amall_http.ml?at=default#cl-561 -- вот чтение http-заголовка (не микро, но интересны только пара строчек).
"read_method" -- итерат, читающий метод (get/post/..).
">>=" -- bind для монады итератов (не IO-монады).
При выполнении "read_method >>= fun .. -> .." bind итератов рассматривает значение read_method. Это значение на нижнем уровне представляет собой итерат, который хочет данные, и с этими данными он делает вот что: из массива символов берёт всё, пока не встретит пробел, но не более заданного количества символов.
Если данные есть, то прочитанное/обработанное передаётся в замыкание "fun meth -> дальнейшее чтение..", а остаток массива символов используется bind'ом итератов для кормления того, что получится после применения значения с http-методом к "fun meth -> .." -- там будет очередной итерат.
Получается, http-метод, когда прочитан, появляется в "состоянии" как значение, находящееся в окружении замыкания (closure environment), имеет имя meth, доступен ниже по коду.
А внутри итераты представляют собой своего рода стейт машину, которая на вход получает массив символов, а выход у неё "Всё прочитал, но не определился с возвращаемым значением, давай ещё данные | Мне хватило, вот значение, вот остаток массива".
Запускалка этих машин -- энумератор, его делом является: взять итерат-аргумент, который будем кормить, создать буфер (массив, из которого будем кормить), читать из сокета в массив, по наличию данных пытаться кормить итерат, пока тот не накушается.
Наверное криво объяснил. Если что-то явно криво/непонятно -- я попробую рассказать другими словами.

Date: 2014-07-12 02:03 pm (UTC)
From: [identity profile] ivan-gandhi.livejournal.com
Не, отлично, все понятно. Я такой метод видел в веб-клиентах, осенью норвежцы показывали в Нью Йорке; теперь тоже так делаю.
  val x = for(
    _      ← openConnection(port);
    h      ← readHeader;
    auth ← decrypt(h.auth);
...etc
   ) yield something(auth,etc)

Date: 2014-07-12 07:26 pm (UTC)
From: [identity profile] huzhepidarasa.livejournal.com
Ну на цацкеле же можно, значит, и на скале не должно быть непреодолимо.

Date: 2014-07-13 01:52 am (UTC)
From: [identity profile] yatur.livejournal.com
Не вставляет. Выглядит примерно как "а вам слабо написать веб-сервер на языке D, используя только правую сторону клавиатуры"?

Profile

juan_gandhi: (Default)
Juan-Carlos Gandhi

May 2025

S M T W T F S
    1 2 3
456 7 8 9 10
11 121314151617
18192021222324
25262728293031

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated May. 13th, 2025 07:09 pm
Powered by Dreamwidth Studios