/pr/ – programming


c996dc996dab1690b4eb9abe6fb0bef071997 – ``DI in FP''

@fab55233225e4e35a60493d590f755a1 Anonymous 2021-06-27 10:53:07
Почему в функциональном программировании не применяется dependency injection (я не видел, может плохо смотрел)?
@3509a7dfbbe544848370f25d57ad6b64 Anonymous 2021-06-27 17:47:55
@fab55@fab55233225e4e35a60493d590f755a1 тайпклассы же
@5c1135ed872b4a7c82b48c146b516d78 Anonymous 2021-06-27 17:48:35
Как они заменяют DI?
@50841c09bcff4898a4fc3239c9bf76ba Anonymous 2021-06-27 17:50:18
@5c113@5c1135ed872b4a7c82b48c146b516d78 вот что такое DI?
@b05bb2ae690649c9881e9a1a1a0957c3 Anonymous 2021-06-27 17:53:51
Это механизм, который позволяет связывать имплементации с интерфейсами в одном месте и механизм автоматической подстановки этих инстансов.
@af84b1274e644233802488ab68582f94 Anonymous 2021-06-27 17:55:01
Тогда получается, что не меняя код можно подставить другую имлементацию в конфиге DI и всё будет работать.
@ba7da7614d32442e92e69e1040756530 Anonymous 2021-06-27 17:55:07
> автоматической
@05fd27c7bde74034bfb1e6abc8ba874e Anonymous 2021-06-27 17:57:32
Тайпклассы - это просто интерфейсы на стероидах. Сами по себе они не есть замена DI. Почему нету DI фреймворков в ФП?
@d2304dd90c3d4222904edf087f3774ba Anonymous 2021-06-27 17:59:30
сейчас понял, что я не до конца понимаю DI
@e1d923c7f3774de2bb3133a34290190e Anonymous 2021-06-27 17:59:31
сейчас понял, что я не до конца понимаю DI
@0bd542c5ba7346b8bcd6536e45312fd7 Anonymous 2021-06-27 18:01:50
а, это экзистенциальные типы
@18cb1b676eb8402bad6e863c5956b4db Anonymous 2021-06-27 18:02:00
с конфигами
@bb9f29c247a941f582b4e1a9c7e6a34f Anonymous 2021-06-27 18:04:32
Экзистенциальные типы я не осилил. Что это, если просто объяснять?
@f20a8d55fa584489b9646bacf5374bf5 Anonymous 2021-06-27 18:05:43
это объект с инкапсулированным с ним типом
@566e0c2a867240129e623ec9dcb127b7 Anonymous 2021-06-27 18:07:25
ты можешь подставить любой объект в качестве экзистеншала, главное, чтоб у него были указанные трейты
@01318cf2ca1b412e8d36a8149eac773b Anonymous 2021-06-27 18:08:56
то есть, ты можешь создать список [Wrap 1, Wrap "foo", Wrap ("bar", 2)] :: [Wrap (forall t. Show t => t)]
@bf8181a051114d36be1e5ddc5b0879b6 Anonymous 2021-06-27 18:17:56
Ну так это получается просто обёрнутый тип. В чём профит? То же самое, что Show t, просто обёрнуто.
@6192e752daf9402ebe4658c8a371649f Anonymous 2021-06-27 18:19:17
гетерогенность
@854d01c17fc940018e8aacea0fa50693 Anonymous 2021-06-27 18:20:01
ты не можешь передать функции f :: (Show t) => [t] список [1, "foo", ("bar", 2)]
@2ccf05a383144335bd214da785348671 Anonymous 2021-06-27 18:21:06
но вот это валидно (хотя и бесполезно в контексте обсуждения):
f [1,2,3]
f ["foo","bar","baz"]
@9e6f29af85ac406a9496ce49b2e7a4ef Anonymous 2021-06-27 18:21:50
Это какие-то просто костыли хаскеля. Потому что forall написать где надо не могут у f.
@179ac0da3cb34cea92e3eb62d8266441 Anonymous 2021-06-27 18:22:54
это костыли для system f
@a52451f0c1a2458c924d4e49e24f06b8 Anonymous 2021-06-27 18:25:58
f :: [forall t. Show t => t]
так должно быть
@b98bbc3b2f364c1393feafce2ae878e6 Anonymous 2021-06-27 18:27:15
@a5245@a52451f0c1a2458c924d4e49e24f06b8 наивный подход
@eac2af2e356145bdbeb73f4bd37b46d9 Anonymous 2021-06-27 18:27:43
там где-то импредикативность выскакивает, не помню где, поэтому так никто не делает
@981b24698b1946e999016d96f1fdaba7 Anonymous 2021-06-27 18:28:09
(по крайней мере, в яп с sound системой типов)
@a9aa2be6110948a6b69afab62fc6b2ad Anonymous 2021-06-27 18:35:46
Мне кажется оно будет sound. Вывод типов не будет работать - это да.
@b9d5839722da4d188f70da8f974a7edc Anonymous 2021-06-27 18:40:10
не, не будет
[[[[[...]]]]] :: [forall t. Show t => t]
@7295451e6745482ea849a343a84a4f44 Anonymous 2021-06-27 18:40:44
или будет
@1523ee41b6e14e1883ffaa92bc12a96a Anonymous 2021-06-27 18:40:58
я хз короч
@75409a36c137442aa76b303c3ca71b79 Anonymous 2021-06-27 18:42:09
а, ты еще не можешь распаковать Wrap и вернуть из него экзистеншл
@aa31e6df7edc420c97e2fd4d4f900408 Anonymous 2021-06-27 18:42:31
ты можешь использовать его только в контексте распаковки