Size: a a a

2020 May 23

YS

Yan Shkurinskiy in Haskell
Alexander Vershilov
https://github.com/qnikst/hasql-extra/blob/master/src/Hasql/Encoders.hs#L122-L124 возьми такую штуку и запили для него развертывалку генериков
Посмотрю)
источник

AV

Alexander Vershilov in Haskell
Там СЛОЖНО
источник

AV

Alexander Vershilov in Haskell
И с поведением для Maybe
источник

YS

Yan Shkurinskiy in Haskell
Это уже завтра, которое сегодня х)
источник

YS

Yan Shkurinskiy in Haskell
Спасибо!
источник

AV

Alexander Vershilov in Haskell
Я бы сделал newtype AsGeneric для него разворачивание через generic
источник

AV

Alexander Vershilov in Haskell
И тогда можно передавать в конвертет или завернутое в AsGeneric или писать deriving Unnest via (AsGeneric X)
источник

AV

Alexander Vershilov in Haskell
Инстанс правда надо хитрый, чтобы поля заворачивал в AsGeneric рекурсивно
источник
2020 May 24

ИБ

Игорь Бесчастнов... in Haskell
Всем привет!
Помогите, пожалуйста, столкнулся со следующей проблемой, возможно немного ламерской:
У меня есть тип Expr определенный (для примера) как
data Expr
 = Int Integer
 | Call String [Expr]
И так далее - смысл в том, что его конструкторы ссылаются на него же.

Я хочу добавить (не заменить, нужны оба) тип TypedExpr, который я изначально хотел определить как
"data TypedExpr = TypedExpr ExprType Expr" - тип и выражение
Однако Expr ссылается на сам себя, и для TypedExpr я бы хотел заменить внутри всех конструкторов Expr на TypedExpr.
То есть в примере выше "Call String [Expr]" по идее должен стать "Call String [TypedExpr]".
Пробовал делать что-то типо
data Expr' e
 = Int Integer
 | Call String [e]

И определять
type Expr = Expr' Expr - ругается на цикл в определении
type Expr = Expr' Expr' -  ругается, вполне очевидно, что для последнего Expr' не хватает аргумента
newtype Expr = Expr (Expr' Expr) - работает, но очень много кода завязано на паттерн матчинге на текущее опредление Expr, и переписывать не хочется. Можно было бы под такой newtype переделать через view-паттерны, но это все равно куча работы, плюс есть много кода который Expr парсит и создает, его приется просто вручную допиливать.

Есть какие-то способы добавить TypedExpr так, чтоб и рыбку съесть, и косточкой не подавиться?
источник

ИБ

Игорь Бесчастнов... in Haskell
Насколько я понимаю, в этом случае надо использовать подход recursion schemas, но это я не на прод, а для себя пишу, и переписывать кучу кода под него будет печально
источник

MK

Maxim Koltsov in Haskell
вместо type Expr = Expr' Expr' можно попробовать type Expr = Fix Expr' ?
источник

MK

Maxim Koltsov in Haskell
вроде для этого оно и придумано
источник

MK

Maxim Koltsov in Haskell
впрочем тут сейчас люди поумнее ответят
источник

к

кана in Haskell
чтобы не перписывать, можно сделать так

data Expr' a
 = Int' a Int
 | Call' a [Expr']

а потом
pattern Int a = Int' () a
pattern Call a  b = Call' () a b

и тогда
Expr () -> Expr Type
как раз и добавит типы
источник

к

кана in Haskell
но лучше конечно переписать
источник

AV

Alexander Vershilov in Haskell
data E a = Int Integer | Call String [E a]

type Expr = E ()
data TypedExpr = TE Type (E TypedExpr)
источник

к

кана in Haskell
кана
но лучше конечно переписать
а не, я думал типы как значения будут
источник

к

кана in Haskell
отбой тогда
источник

к

кана in Haskell
кана
а не, я думал типы как значения будут
а не, именно так ты и хотел
источник

ИБ

Игорь Бесчастнов... in Haskell
Alexander Vershilov
data E a = Int Integer | Call String [E a]

type Expr = E ()
data TypedExpr = TE Type (E TypedExpr)
Я как человек пришедший из питона () воспринимаю на подкорке все еще как пустой tuple, поэтому о таком даже не подумал) Попробую, спасибо
источник