Size: a a a

F# Flood: ПДД made functional, making illegal state INGIBDDdale

2020 May 06

VS

Vasily Shapenko in F# Flood: ПДД made functional, making illegal state INGIBDDdale
Обычно это неправда
источник

DS

Doge Shibu in F# Flood: ПДД made functional, making illegal state INGIBDDdale
Shub Niggurath
не, вопрос не как контролировать эффекты, а 1) что подразумевается под контролем эффектов? и 2) как конкретно они контролируются?
Ну народ это может сильно по разному трактовать. Я бы сказал:

1. Возможность работать с побочными эффектами как с обычными значениями языка (это можно и в обычно ссылочно-прозрачном коде добится) + то, что в сигнатуре функции отображаются те побочные эффекты, что в ней используются

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

DS

Doge Shibu in F# Flood: ПДД made functional, making illegal state INGIBDDdale
Vasily Shapenko
Обычно это неправда
Что? Что можно подменить вызов БД на мок?
источник

VS

Vasily Shapenko in F# Flood: ПДД made functional, making illegal state INGIBDDdale
Да я вот сколько общаюсь, никак не пойму
источник

VS

Vasily Shapenko in F# Flood: ПДД made functional, making illegal state INGIBDDdale
Что конкретно это упрощает
источник

SN

Shub Niggurath in F# Flood: ПДД made functional, making illegal state INGIBDDdale
Doge Shibu
Что? Что можно подменить вызов БД на мок?
там человек подразумевал один конкретный вызов, а не подмена вообще всех вызовов к БД
источник

DS

Doge Shibu in F# Flood: ПДД made functional, making illegal state INGIBDDdale
Shub Niggurath
там человек подразумевал один конкретный вызов, а не подмена вообще всех вызовов к БД
И в чём проблема? Это можно сделать.
источник

SN

Shub Niggurath in F# Flood: ПДД made functional, making illegal state INGIBDDdale
Doge Shibu
Ну народ это может сильно по разному трактовать. Я бы сказал:

1. Возможность работать с побочными эффектами как с обычными значениями языка (это можно и в обычно ссылочно-прозрачном коде добится) + то, что в сигнатуре функции отображаются те побочные эффекты, что в ней используются

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

каким образом ты "работаешь" с побочными эффектами как с обычными значениями? чем побочный эффект отличается от callable?
источник

SN

Shub Niggurath in F# Flood: ПДД made functional, making illegal state INGIBDDdale
Doge Shibu
И в чём проблема? Это можно сделать.
можно сделать в теории или регулярно делается? потому что ни в одном примере этого не наблюдалось. ну там в принципе вообще мало что наблюдалось, все примеры, которые мне показывали были уровня факториала по сложности решаемой проблемы и вещами типа тестирования там и не пахло. ну оно и понятно, потому что там все усилия были направлены на "взлететь со всей этой хренью". но вообще было бы интересно посмотреть
источник

SN

Shub Niggurath in F# Flood: ПДД made functional, making illegal state INGIBDDdale
это понятное дело не претензия к mtl\tf, это скорее к категории людей, которые туда почему-то идут
источник

DS

Doge Shibu in F# Flood: ПДД made functional, making illegal state INGIBDDdale
Shub Niggurath
можно сделать в теории или регулярно делается? потому что ни в одном примере этого не наблюдалось. ну там в принципе вообще мало что наблюдалось, все примеры, которые мне показывали были уровня факториала по сложности решаемой проблемы и вещами типа тестирования там и не пахло. ну оно и понятно, потому что там все усилия были направлены на "взлететь со всей этой хренью". но вообще было бы интересно посмотреть
Очень условно, делается это в таком стиле, если вещи типа репозиториев ты делаешь эффектом:
newtype MyTestAppIO a = ReaderT Ctx (... (IO a)) derive (Monad, MonadReader Ctx, ...)
instance MyRepository  MyTestAppIO where
  getUserById id = myMockFunction

Если вещи типа репозиториев протаскиваются как обычные сервисы (или рекорды функций, если речь о хаскеле), то всё один в один как с обычными ОО моками.
источник

DS

Doge Shibu in F# Flood: ПДД made functional, making illegal state INGIBDDdale
Если речь про фри монады, то там делаешь тестовый интерпретатор, где делаешь паттерн матч на GetUserId и точно так же вызываешь код мока
источник

SN

Shub Niggurath in F# Flood: ПДД made functional, making illegal state INGIBDDdale
Doge Shibu
Очень условно, делается это в таком стиле, если вещи типа репозиториев ты делаешь эффектом:
newtype MyTestAppIO a = ReaderT Ctx (... (IO a)) derive (Monad, MonadReader Ctx, ...)
instance MyRepository  MyTestAppIO where
  getUserById id = myMockFunction

Если вещи типа репозиториев протаскиваются как обычные сервисы (или рекорды функций, если речь о хаскеле), то всё один в один как с обычными ОО моками.
это ответ на вопрос "как", но не на вопрос "зачем", особенно в свете того, что там все один в один с обычными ОО моками. ок, допустим, в хаскеле нет объектов, но в языках с продом они есть
источник

SN

Shub Niggurath in F# Flood: ПДД made functional, making illegal state INGIBDDdale
в скале точно есть
источник

VS

Vasily Shapenko in F# Flood: ПДД made functional, making illegal state INGIBDDdale
Не в обиду собакену, в скалу идет куча ебанатов
источник

VS

Vasily Shapenko in F# Flood: ПДД made functional, making illegal state INGIBDDdale
Опять же , ебанат - скорее склад характера и подход к решению проблем
источник

VS

Vasily Shapenko in F# Flood: ПДД made functional, making illegal state INGIBDDdale
Чем характеристика интеллекта
источник

DS

Doge Shibu in F# Flood: ПДД made functional, making illegal state INGIBDDdale
Shub Niggurath
в скале точно есть
Ну мотивация - "я использую mtl, чтобы было проще тестировать" - она немного странная, потому что тестирование там не особо проще.

Разве что можно в некоторых тестах убрать асинхронность, если есть желание, но это не какой-то супер пупер выигрыш.
источник

R

Roman in F# Flood: ПДД made functional, making illegal state INGIBDDdale
Vasily Shapenko
Что конкретно это упрощает
Глобальная идея — сделать так, чтобы для полного понимания работы метода было достаточно прочесть сигнатуру, а не читать весь колл стек.

Например, в сишарпе нихуя непонятно, чего ожидать от метода Task AccountService.CreateAccount(string userId, Account account). Пушто это блядина совершенно точно кидает исключения (которые как раз приходится читать в недрах имплементации и только там), и еще возможно мутирует Account, например, проставляя там айдишник, сгенерированный базой.
источник

VS

Vasily Shapenko in F# Flood: ПДД made functional, making illegal state INGIBDDdale
Roman
Глобальная идея — сделать так, чтобы для полного понимания работы метода было достаточно прочесть сигнатуру, а не читать весь колл стек.

Например, в сишарпе нихуя непонятно, чего ожидать от метода Task AccountService.CreateAccount(string userId, Account account). Пушто это блядина совершенно точно кидает исключения (которые как раз приходится читать в недрах имплементации и только там), и еще возможно мутирует Account, например, проставляя там айдишник, сгенерированный базой.
Я так понимаю, уровень исполнителей, как обычно, дотягивает только до имитации упрощения
источник