Size: a a a

2021 April 02

к

кана in Haskell Start
data family Cmd a
data SomeCmd where
 SomeCmd :: Execute a => Cmd a -> SomeCmd

data One
data instance Cmd One = CmdTwo ...

data Two
data instance Cmd Two = CmdTwo ...

(SomeCmd <$> one) <> (SomeCmd <$> two) <> ...
источник

ЗП

Зигохистоморфный Пре... in Haskell Start
haskus + generate EADT
источник

ЗП

Зигохистоморфный Пре... in Haskell Start
тоже ок
источник

к

кана in Haskell Start
кана
data family Cmd a
data SomeCmd where
 SomeCmd :: Execute a => Cmd a -> SomeCmd

data One
data instance Cmd One = CmdTwo ...

data Two
data instance Cmd Two = CmdTwo ...

(SomeCmd <$> one) <> (SomeCmd <$> two) <> ...
даже еще лучше

class Cmd a where
 data CmdArgs a
 execute :: CmdArgs a -> IO ()

-- instance CmdArgs "one" where -- или использовасть строки
data One
instance Cmd One where
 data CmdArgs One = CmdOne {a :: Int}
 execute CmdOne{a} = print a

data SomeCmd where
 SomeCmd :: Cmd a => CmdArgs a -> SomeCmd

(SomeCmd <$> one) <> (SomeCmd <$> two) <> ...
case someCmd of
 SomeCmd args -> execute args
источник

ЮБ

Юрий Богомолов... in Haskell Start
> instance CommandArgs One where
>  data ComandArgs One = CmdOne {a :: Int}
>  execute Cmd{a} = print a

Тут не instance Command One должно быть?
источник

к

кана in Haskell Start
да, поправил в нескольких местах
источник

к

кана in Haskell Start
Юрий Богомолов
Да, я так сделал, но это не расширяемый путь. При добавлении новой команды придется править и этот тип-сумму, чего хочется избежать.
но все равно не расширяемо же получается) Нужно будет добавлять эти команды в парсер
источник

к

кана in Haskell Start
если это сделать типом-суммой, то это можно и сгенерить будет, и тогда нельзя будет забыть добавить
источник

к

кана in Haskell Start
так что я бы сделал тип-сумму вместо дата-фемелей
источник

ЮБ

Юрий Богомолов... in Haskell Start
Угу, я вот ломаю голову, как сделать так, чтобы модуль с командой определял всё, что нужно для ее парсинга и выполнения, а в главном модуле просто импортировать модули со всеми командами, собирать общий парсер и «запускать» его результаты через тайпкласс Command
источник

JS

Jerzy Syrowiecki in Haskell Start
Юрий Богомолов
Да, я так сделал, но это не расширяемый путь. При добавлении новой команды придется править и этот тип-сумму, чего хочется избежать.
все так делают и не страдают. бойлерплэйт есть, но минимальный, его не замечаешь
источник

ЮБ

Юрий Богомолов... in Haskell Start
Хм, окей. Видимо, я сам себе головную боль придумал ) Спасибо, откачусь тогда на вариант с обычной суммой.
источник

JS

Jerzy Syrowiecki in Haskell Start
зато при использовании обычных закрытых сумм бесплатно получаешь возможность увидеть весь UI сверху
источник

JS

Jerzy Syrowiecki in Haskell Start
понятие расширяемости лучше применять к тем случаям, когда ядро находится в одном продукте, а компоненты в другом. CLI — это не тот случай
источник

JS

Jerzy Syrowiecki in Haskell Start
хотя, иногда такой случай бывает, например, расширения git, но там манипуляции кодом не помогут
источник
2021 April 03

ЮБ

Юрий Богомолов... in Haskell Start
кана
даже еще лучше

class Cmd a where
 data CmdArgs a
 execute :: CmdArgs a -> IO ()

-- instance CmdArgs "one" where -- или использовасть строки
data One
instance Cmd One where
 data CmdArgs One = CmdOne {a :: Int}
 execute CmdOne{a} = print a

data SomeCmd where
 SomeCmd :: Cmd a => CmdArgs a -> SomeCmd

(SomeCmd <$> one) <> (SomeCmd <$> two) <> ...
case someCmd of
 SomeCmd args -> execute args
Хочу еще раз отдельно поблагодарить за помощь. Я в итоге смог сделать то, что хотел изначально, с помощью этого подхода, и fastsum не понадобился 🙂
источник

ЕИ

Евгений Иванов... in Haskell Start
всем привет.

Можно ли здесь избавится от скобок ?
putStrLn $ show $ sum' (read a) (read b)
источник

JS

Jerzy Syrowiecki in Haskell Start
Евгений Иванов
всем привет.

Можно ли здесь избавится от скобок ?
putStrLn $ show $ sum' (read a) (read b)
можно, но не нужно
источник

JS

Jerzy Syrowiecki in Haskell Start
read тоже не надо использовать, если это не одноразовая программа
источник

ЕИ

Евгений Иванов... in Haskell Start
Jerzy Syrowiecki
можно, но не нужно
а как ?
источник