Size: a a a

2021 March 04

IK

Ilya Kos in Haskell
А, ну надо будет флаг ещё в класс пихнуть
источник

к

кана in Haskell
Ilya Kos
Для этого есть тайпфемили
тайпфемели закрытая, а инстансы класса нет, фандепы сломаются
источник

к

кана in Haskell
ну ты попробуй, если получится, то покажи
источник

к

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

JS

Jerzy Syrowiecki in Haskell
GNU/Vsevolod
И как парсится json?
код парсеров состоит из кучи проверок
источник

G

GNU/Vsevolod in Haskell
Jerzy Syrowiecki
код парсеров состоит из кучи проверок
Ну я о том, как распаршенный json укладывается в рекорд.
Т.е. есть 2 способа
- узнать поля структуры при сборке и сгенерить код, который парсит json и создает рекорд (как serde в rust)
- узнать поля в рантайме через рефлексию, достать их же из условного JsonValue, через ту же рефлексию сложить в рекорд (так вроде бы в golang json.Unmarshal)
источник

JS

Jerzy Syrowiecki in Haskell
GNU/Vsevolod
Ну я о том, как распаршенный json укладывается в рекорд.
Т.е. есть 2 способа
- узнать поля структуры при сборке и сгенерить код, который парсит json и создает рекорд (как serde в rust)
- узнать поля в рантайме через рефлексию, достать их же из условного JsonValue, через ту же рефлексию сложить в рекорд (так вроде бы в golang json.Unmarshal)
когда мы запускаем парсер для заданного типа, мы его структуру уже знаем, рефлексия не нужна
источник

JS

Jerzy Syrowiecki in Haskell
а, понял, что вы имеете в виду. да, можно через рефлексию, но это какое-то переусложнение для языка с типами
источник

к

кана in Haskell
GNU/Vsevolod
Ну я о том, как распаршенный json укладывается в рекорд.
Т.е. есть 2 способа
- узнать поля структуры при сборке и сгенерить код, который парсит json и создает рекорд (как serde в rust)
- узнать поля в рантайме через рефлексию, достать их же из условного JsonValue, через ту же рефлексию сложить в рекорд (так вроде бы в golang json.Unmarshal)
советую почитать про Generic доку и пару статей
источник

G

GNU/Vsevolod in Haskell
Jerzy Syrowiecki
когда мы запускаем парсер для заданного типа, мы его структуру уже знаем, рефлексия не нужна
Т.е. в хаскеле есть какой-то кодген для парсера?
источник

JS

Jerzy Syrowiecki in Haskell
aeson тоже может работать через Generic, но это "рефлексия" во время компиляции
источник

к

кана in Haskell
тайпклассы есть)
источник

JS

Jerzy Syrowiecki in Haskell
GNU/Vsevolod
Т.е. в хаскеле есть какой-то кодген для парсера?
конкретно в aeson есть 2 механизма — кодогенерация через TemplateHaskell и статическая рефлексия через Generic
источник

к

кана in Haskell
GNU/Vsevolod
Т.е. в хаскеле есть какой-то кодген для парсера?
несколькими сообщений выше ты спрашивал про функцию, и ты тоже думал что решается рефлексией. И я кинул решение без нее. В целом это должно было натолкнуть на какие-то мысли я думаю
источник

к

кана in Haskell
еще один абстрактный маленький пример, который тоже может натолкнуть на какие-нибудь мысли

class GetTypeName a where
 getTypeName :: a -> String

instance GetTypeName Int where
 getTypeName _ = "int"

instance GetTypeName Bool where
 getTypeName _ = "bool"

main = do
 print (getTypeName (1 :: Int)) -- "int"
 print (getTypeName True) -- "bool"
источник

G

GNU/Vsevolod in Haskell
кана
несколькими сообщений выше ты спрашивал про функцию, и ты тоже думал что решается рефлексией. И я кинул решение без нее. В целом это должно было натолкнуть на какие-то мысли я думаю
Чем отличается от compile time инф-ции о типах?
источник

к

кана in Haskell
что отличается?
источник

JS

Jerzy Syrowiecki in Haskell
TemplateHaskell тоже, наверно, можно назвать статической рефлексией
источник

VD

Velvet Darkness in Haskell
Есть тип вида data Foo s = Foo { arr :: STUA.Array s Word16 }.
В main'е создаю его значение через stToIO. Потом это значение хочу передать в другую функцию, которая возвращает IO ()
Получается anotherFunction :: Foo RealWorld -> IO ().
Это норма или я как-то неправильно живу?
источник

JS

Jerzy Syrowiecki in Haskell
Velvet Darkness
Есть тип вида data Foo s = Foo { arr :: STUA.Array s Word16 }.
В main'е создаю его значение через stToIO. Потом это значение хочу передать в другую функцию, которая возвращает IO ()
Получается anotherFunction :: Foo RealWorld -> IO ().
Это норма или я как-то неправильно живу?
почему не Vector?
источник