Size: a a a

2020 November 06

ПК

Паша Калугин... in Haskell
Да
источник

Y

Yuuri in Haskell
Для deriving никак. Только писать свой instance
источник

AV

Alexander Vershilov in Haskell
В смысле reified enum сделать?
источник

ПК

Паша Калугин... in Haskell
Нужно написать что-то вроде
instance CommandFirst Show where
   show Start = "start"
   show Quit = "quit"
?
источник

a

adam in Haskell
Alexander Vershilov
В смысле reified enum сделать?
ну этот reified не является самим тайплевел листом в своём понимании, просто небольшая обходка при unsafeCoerce
источник

a

adam in Haskell
там суть в том, что ты явно словарики прокидываешь, не думаю что можно просто так взять и сконструировать тайплевел лист из значений
источник

Y

Yuuri in Haskell
Паша Калугин
Нужно написать что-то вроде
instance CommandFirst Show where
   show Start = "start"
   show Quit = "quit"
?
Если нужно только первую букву поменять, можно обёртку:
data CommandFirst = <…> deriving (Show, Read)
newtype CommandFirstShow = CFS {unCFS :: CommandFirst}
instance Show CommandFirstShow where
   show = uncap . show . unCFS
instance Read CommandFirstShow where
   read = CFS . read . cap
источник

AV

Alexander Vershilov in Haskell
adam
ну этот reified не является самим тайплевел листом в своём понимании, просто небольшая обходка при unsafeCoerce
Ну мне typelevel список и не нужен
источник

AV

Alexander Vershilov in Haskell
Мне нужен локальный инстанс
источник

AV

Alexander Vershilov in Haskell
Yuuri
Если нужно только первую букву поменять, можно обёртку:
data CommandFirst = <…> deriving (Show, Read)
newtype CommandFirstShow = CFS {unCFS :: CommandFirst}
instance Show CommandFirstShow where
   show = uncap . show . unCFS
instance Read CommandFirstShow where
   read = CFS . read . cap
Ещё раз громко скажу, что не стоит использовать инструменты не по назначению, это приведёт к крайне большому количеству проблем и хаков для их решения. А сложность и поддерживаемость решения будет расти чуть-ли не экспоненциально
источник

AV

Alexander Vershilov in Haskell
Show/Read это средства отладки, и это очень хорошо когда выдачу Show можно складывать в ghci и она будет автоматом читаться. В общем любое желание поменять дефолтный инстанс Show это нехороший флаг
источник

Y

Yuuri in Haskell
> не стоит использовать инструменты не по назначению
Использовать хаскель для продакшена? 😜
источник

AV

Alexander Vershilov in Haskell
adam
ну этот reified не является самим тайплевел листом в своём понимании, просто небольшая обходка при unsafeCoerce
Кажется аналогичную штуку я могу сделать, оно даже сработает и похоже неплохо
источник

ПК

Паша Калугин... in Haskell
Yuuri
Если нужно только первую букву поменять, можно обёртку:
data CommandFirst = <…> deriving (Show, Read)
newtype CommandFirstShow = CFS {unCFS :: CommandFirst}
instance Show CommandFirstShow where
   show = uncap . show . unCFS
instance Read CommandFirstShow where
   read = CFS . read . cap
Ну, у меня instance получилось быстрее и короче сделать
источник

a

adam in Haskell
Alexander Vershilov
Кажется аналогичную штуку я могу сделать, оно даже сработает и похоже неплохо
Ну да, проксю можешь достать из s в Reifies s a инстансе если обернёшь свой енум в ньютайп который сохраняет проксю

λ> reify ([1,2,3] :: [Int]) $ \l -> foldr (+) 0 (reflect l)
6
источник

AV

Alexander Vershilov in Haskell
reify / reflect без обёрток не хватит
источник

AV

Alexander Vershilov in Haskell
Но в общем суть ясна
источник

AV

Alexander Vershilov in Haskell
Даже прямую зависимоть на reflection делать не придётся
источник

YR

Yuki Rito in Haskell
Вот написал такое грубо говоря -
class X a where x :: String -> Maybe a
newtype Helper a = Helper a
instance X a => SomeClass (Helper a) where ....

data DDD = ....
 deriving SomeClass via (X DDD)

работает как надо. Но задумался, а как оно работает? Ведь методы SomeClass-а работают не с DDD, а с Helper DDD. Но оно как-то из инстанса для Helper DDD выводит инстанс для DDD. То есть он сркыто внизу использует как бы deriving newtype? На нем получается базируется deriving via? А если Helper не newtype, а data? Тогда он как выведет?
источник

к

кана in Haskell
coerce
источник