
Aleksey
11.05.2018
07:53:04
(или наоборот)

Александр
11.05.2018
07:53:42
Попробую прояснить. Императивный IoC, - это такой, для которого нечистый (IO) рантайм подменяется на время действия клиентской части. То есть, клиентские сценарии написаны в IO, и действуют непосредственно в нем. Иными словами, сценарии не отделены от IO-рантайма ничем, кроме, быть может, стека из других монад.

Aleksey
11.05.2018
07:54:19
в MTL стеке не обязан быть IO внизу

Александр
11.05.2018
07:55:30

Google

Alister
11.05.2018
07:55:32
как щитаете
существует 10х девелопер?

A64m
11.05.2018
07:56:02
но IO же абстрактный
если он имплементирован как АСТ, которое интерпретируется - это уже будет неимперативный IoC?

Александр
11.05.2018
07:56:02
Думаю, нет
Думаю, существуют 10x нубы ;)

Aleksey
11.05.2018
07:57:05
0.1x developers

Александр
11.05.2018
07:57:55

Aleksey
11.05.2018
07:59:24
Есть мнение, что 1x developer настолько же мифический, как и любой другой kx developer

Alexander
11.05.2018
07:59:32

Aleksey
11.05.2018
07:59:59
да, слов порядок вышел хороший не слишком

kana
11.05.2018
08:00:26

Google

Aleksey
11.05.2018
08:00:49
Вы упороты :)
И коупороты друг другу :P

Alexander
11.05.2018
08:01:36
блин уменя дилема
поидее нужно сделать типизированное GADT, но это так лень

Александр
11.05.2018
08:01:58
А является ли ООП с необходимостью императивщиной?

Alexander
11.05.2018
08:02:09
и усложнит часть кода, с другой стороны 100500 случаев рассматривать не надо

Alister
11.05.2018
08:02:35
стрелочка от кого к кому?

Index
11.05.2018
08:02:49

Александр
11.05.2018
08:03:04

Aleksey
11.05.2018
08:03:08
"Оголтело-отбитая парадигма"

Index
11.05.2018
08:03:25

Дед Пегас
11.05.2018
08:03:39
Операционное отделение психиатрии.
Или особое отделение психиатрии.

Александр
11.05.2018
08:04:07
Очень Относительное Понятие

A64m
11.05.2018
08:05:21
ООП == мутабельные ссылки

Index
11.05.2018
08:05:50
IORef это ООП теперь?

Aleksey
11.05.2018
08:06:02
OOPRef
IOOP

Ilya
11.05.2018
08:06:31
ООП это использование & вместо $

A64m
11.05.2018
08:06:35

Google

Александр
11.05.2018
08:06:50

Aleksey
11.05.2018
08:07:23
А такая аббревиатура даже есть. Но во что раскрывается, я забыл...

Index
11.05.2018
08:07:40
Я бы сказал, что в первом приближении ООП это когда есть объекты, то есть группы методов, манипулирющих скрытым (инкапсулированным) состоянием. Типа
data Object =
Obj { doX :: IO (), doY :: A -> IO () }
где doX и doY оперируют общим IORef
И иногда так делать очень даже удобно, так что особо гнать на ООП я бы не стал
Но как фундамент для языка это бесполезно, конечно, т.к. объектами далеко не каждую сущность полезно представить

Aleksey
11.05.2018
08:10:06
Как всегда "технология ок, но люди - тупые"

Евгений
11.05.2018
08:10:29
Всю жизнь думал, что ООП это структурная подтипизация

A64m
11.05.2018
08:10:44
> Как всегда "технология ок
так никогда не бывает

Aleksey
11.05.2018
08:11:14
Технологии тоже плохие?

A64m
11.05.2018
08:11:20

Александр
11.05.2018
08:11:45

A64m
11.05.2018
08:11:50
в одном языке, проще говоря

Aleksey
11.05.2018
08:14:13
POOP
https://www.acronymattic.com/Proper-Object-Oriented-Programming-(POOP).html

Александр
11.05.2018
08:15:05

Евгений
11.05.2018
08:15:08

Ilya
11.05.2018
08:15:23
Интересно, а в чате какого-нибудь C++ ведутся такие же упоротые разговоры о ФП? ?
Типа
- ФП это std::transform
- Нет, ФП это attribute _((pure))
- Нет же лол, ФП это [](auto a, auto b) {return a*b;};

A64m
11.05.2018
08:16:06
да

Alexander
11.05.2018
08:16:47
Вы бы видели что в JS называют фп

Index
11.05.2018
08:16:52
в ФП чатах тоже решить что такое ФП не могут

A64m
11.05.2018
08:17:20
ладно, раз тут @int_index появился надо повторить вопрос

Google

A64m
11.05.2018
08:18:26
допустим, мы хотим выбирать тайпкласс в месте использования функции

Александр
11.05.2018
08:19:15

Index
11.05.2018
08:19:18
интересное начало, а как мы его выбираем?
и до того как мы его выбрали, то как код пишется, если он не знает, из какого класса ему тёрмы доступны?

A64m
11.05.2018
08:21:55
мы выбираем указанием ньютайпа, для которого имплементирован тот инстанс, который нам нужен
после чего кастим функцию к тому типу, который нужен в месте использования
вопрос в том, как это сделать с минимальными аннотациями типов

Index
11.05.2018
08:24:49
если я правильно понял, то нам дано
class Foo a where
foo :: ...
instance Foo A
instance Foo B
class Bar x where
bar :: ...
instance Bar X
instance Bar Y
и мы хотим Quux a, который дает метод quux, где quux = foo для A и B, и quux = bar для X и Y?

Leonid
11.05.2018
08:29:02
Вот да https://www.reddit.com/r/haskell/comments/8ilw75/there_are_too_many_prettyprinting_libraries/

A64m
11.05.2018
08:30:02
что мы точно можем:
> foo :: Ord a => ([Down a] -> [Down a]) -> [a] -> [a]; foo = coerce
> foo sort [1..10]
[10,9,8,7,6,5,4,3,2,1]
что хотелось бы получить
> (sort @@ Down) [1..10]
[10,9,8,7,6,5,4,3,2,1]
вопрос в том, насколько мы можем продвинутся из пункта А в пункт Б
@int_index ^

Index
11.05.2018
08:31:58
Я не понял где тут "выбирать тайпкласс", работаем только с Ord

A64m
11.05.2018
08:32:10
инстанс

Index
11.05.2018
08:36:17
import Data.Coerce
(@@) :: (Ord b, Coercible a b) => ([b] -> [b]) -> (a -> b) -> ([a] -> [a])
(@@) f _ = coerce f
*Main Data.List Data.Ord> (sort @@ Down) [1,2,3]
[3,2,1]
Вот так что ли?

A64m
11.05.2018
08:37:32
это должно работать не только для sort
тут есть два пути добавления большего числа аннотаций, как я понимаю
1) описывать "структуру" того, что мы кастим т.е.
(sort @@ map Down) [1..10]
2) конкретные типы и семейства типов, которые конструируют "обернутый" тип
(foo @Int @Down sort) [1..10::Int]
что не весело совсем

Rustem
11.05.2018
08:42:36
Что делает >>=
Можно примеры?

Andrew
11.05.2018
08:43:46
(>>=) :: m a -> (a -> m b) -> m b

Google

A64m
11.05.2018
08:45:16

Leonid
11.05.2018
08:45:45
ну наконец-то начали ругать https://gist.github.com/chexxor/23ccf35add7dbdd33ecdd26888663140

Yuriy
11.05.2018
08:47:27

A64m
11.05.2018
08:48:54
> [1..5] >>= (:[])
[1,2,3,4,5]

Index
11.05.2018
08:50:41

A64m
11.05.2018
08:51:52

Denis
11.05.2018
08:52:37

A64m
11.05.2018
08:53:35
или может для конкретных но с меньшими аннотациями в месте использования

Yuriy
11.05.2018
08:57:37
а, там предыстория выше


Index
11.05.2018
08:58:28
Скорее такое
type family Modify (a :: k1) (b :: k2) (f :: k3) :: k3 where
Modify a b a = b
Modify a b (f x) = (Modify a b f) (Modify a b x)
Но я не знаю как от аннотаций избавляться
Хм, оно еще не редьюсится почему-то
*Main Data.List Data.Ord> :kind! Modify Int (Down Int) ([Int] -> [Int])
Modify Int (Down Int) ([Int] -> [Int]) :: *
= Modify
Int
(Down Int)
(->)
(Modify Int (Down Int) [] (Down Int))
(Modify Int (Down Int) [] (Down Int))
Я ожидал [Down Int] -> [Down Int] получить
Всё, разгадал
Третий кейс забыл
type family Modify (a :: k) (b :: k) (f :: kf) :: kf where
Modify a b a = b
Modify a b (f x) = (Modify a b f) (Modify a b x)
Modify a b c = c
В общем оборачивает оно нормально