Romɑn
Vasily
Может, на пользу пойдет
Vasily
Хотя тут фиг знает
Vasily
Питон это действительно такой vbs
Nikolay
А коррекцию зрения никто не делал? 🤔
Vasily
Для data science
Igor
Igor
Привет, помогите придумать ФП решение для следующей задачи.
На входе есть JSON с коллекцией элементов, разного типа.
На выходе надо получить коллекцию строк.
При решение этой задачи встает две подзадачи:
1) Как в "типах" (десериализовано) должна выглядить эта JSON-коллекция разных объектов?
2) Как трансформировать эту коллекцию в коллекцию строк?
И самое сложное, как это сделать с учетом expression-problem (те добавлять новые типы и трансформации, не меняя старый код)?
Vasily
Ну, начнем с того, что JSON типов ограниченное количество :)
Ayrat
JArray.Parse text
|> Seq.map string
следующий!
Ayrat
:D
Vasily
А что на выходе-то надо?
Igor
А что на выходе-то надо?
List<string>
Функция трансфорации должна быть для каждого "типа" своя (типа нужен полиморфизм)
Vasily
Почему своя, кстати?
Vasily
Ну пока я тут expression-problem не вижу
Vasily
Вложенные типы есть?
Igor
Нет
Vasily
Т.е. тупой плейн список значений с указанием типа?
Vasily
Берешь DU и не паришься
Vasily
String|Int|Bool whatever
Vasily
Какой?
Igor
Новый
Vasily
Новый простой тип придумают или что?
Vasily
Мда
Ayrat
ну в дотнете у всех объектов есть ToString(), пусть все вновь приходящие объекты его реализуют и всё
Ayrat
хотя мы не знаем в рантайме у какого типа вызвать ToString
Igor
Новый простой тип придумают или что?
Чем мне помогут простые тип, что бы десерелизовать это?
[ { type: "person", name: "alex", age: 20 },
{ type: "city", contry: "russia", iscapital: false },
{ type: ... } ... ]
Vasily
type Custom={Type:string;Props:Map<string,myDU>}
Vasily
Такое пойдет?
Vasily
Пихай чо угодно
Vasily
У тебя кастомный тип описывается метадатой
Vasily
В которой имя типа
Vasily
Плюс набор ключ-значение
Ayrat
ну тащи сериализованный экспрешн который говорил бы что ты хочешь сделать в рантайме куда тебя пихнуть
Ayrat
мы его скомпайлим и выполним
Vasily
Или тебе надо типа рекорды?
Vasily
С полями
Vasily
Ну тогда твоя задача в общем виде не решается, извини
Vasily
А хаскель умеет типы на лету строить?
Ayrat
стопе, а что нам мешает IL код генерить на лету?
Ayrat
:D
Vasily
Тайп провайдер называется
Vasily
Такой генератор
Vasily
Ты всегда можешь написать обертку с нужными тебе полями, если так уж приспичит
Vasily
Просто контекста задачи маловато, мягко выражаясь
Vasily
Пока выглядит велосипедно
Ayrat
Если б прилетела такая задача, я сначала попробовал отговорить её решать ТАК
Ayrat
но если всё же в теории её решать ТАК
Vasily
Ну и я о том же
Ayrat
то генерация IL - нормальный костыль
Ayrat
считал данные, сгенерил тип, подгрузил тип, работаем
Vasily
Вообще неясно, откуда данные приходят, куда должны уйти
Vasily
В каком виде
Vasily
А, ты хочешь пофлудить на тему тайп классов
Vasily
ПОнял тебя
Igor
считал данные, сгенерил тип, подгрузил тип, работаем
Не надо ничего генерить, вот все проще.
У тебя в JSON приходит коллекция 2-х типов.
[ { type: "person", name: "alex", age: 20 },
{ type: "city", contry: "russia", iscapital: false } ]
Как их выразить в типах? (что были рекорды)
Vasily
Где-то выше я писал тип
Vasily
Под который они все подходят
Igor
type Something =
| Person of (name : string) * (age : int)
| City of (country: string) * (isCapital: bool)
Vasily
Не
Vasily
Неверный подход
Igor
Vasily
Без хешмапа список рекордов вида {Name:string;Value:MyDU}
Ayrat
эээ. так вопрос в том что MyDU ограничен и нерасширяем
Ayrat
т.е. завтра прилетит тип Project а его там нет
Vasily
Количество простых типов у нас небольшое
Ayrat
так речь не про простые типы