Замечательные типы - это хорошо, но и сама система типов языка должна предоставлять такую возможность - ADT, pattern matching, желательно HKT или хотя бы GAT's.
Забавно. Я в свободное время доказал тьюинг-полноту типовой системы Rust'а реализовав выполнитель SmallF*ck -- облегчённого brainf*ck'а. Разглядел очень много похожих моментов в реализации на типах.
Про мою реализацию написал здесь, правда очень много общего
Использование типовых переменных в определениях инстанса встречается очень часто, чтобы частично применить тип, к примеру кайнд Maybe это * -> *, а необходимый для определения Монады это * -> *, и они совпадают, по этому мы просто определяем инстанс как instance Monad Maybe, а кайнд State есть * -> * -> *, по этому для определения инстанса мы его частично применяем. Про кайнды много рассказать не могу, но мы могу сказать что конкретный тип имеет кайнд *, а контейнеры это как бы функции к типам и имеют тип * -> *. Если будут ещё вопросы, добро пожаловать в личку.
Это проект был создан а обучательных целях, конечно, его никто не будет использовать в реальных целях, в Хаскеле они просто не нужны.
Согласен с 1), но как разработчик в т. ч. на Python мне не столь критичны несколько лишних десятков миллисекунд, повторюсь этот проект в создан обучательных целях.
Со 2) думал, ничего лучше не придумал создавать тип как VarVal = IntVal Int | StrVal String ...
С 3) я разобрался используя типы Maybe, вот сигнатуры публичных get и del ф-ий
get :: Eq name => name -> VarState name val (Maybe val)
del :: Eq name => name -> VarState name val (Maybe ())
Замечательные типы - это хорошо, но и сама система типов языка должна предоставлять такую возможность - ADT, pattern matching, желательно HKT или хотя бы GAT's.
Я к тому, что dpy уже не будет обновляться, в нём поддержка слешей сторонними либами, а есть развивающиеся его форки, как, например nextcord
discord.py стал deprecated до их выпуска
Забавно. Я в свободное время доказал тьюинг-полноту типовой системы Rust'а реализовав выполнитель SmallF*ck -- облегчённого brainf*ck'а. Разглядел очень много похожих моментов в реализации на типах.
Про мою реализацию написал здесь, правда очень много общего
mapM_ print $ [2, 3, 5, 7, 11, 13, 17
]На хаскеле
К ассоциотивности: у
$
ниже приоритет чему
., по этому мы можем делать цепочки типаf . g h . q $ x
поправьте, пожалустаРад, что помог с пониманием :)
Использование типовых переменных в определениях инстанса встречается очень часто, чтобы частично применить тип, к примеру кайнд Maybe это * -> *, а необходимый для определения Монады это * -> *, и они совпадают, по этому мы просто определяем инстанс как instance Monad Maybe, а кайнд State есть * -> * -> *, по этому для определения инстанса мы его частично применяем. Про кайнды много рассказать не могу, но мы могу сказать что конкретный тип имеет кайнд *, а контейнеры это как бы функции к типам и имеют тип * -> *. Если будут ещё вопросы, добро пожаловать в личку.
Я имею ввиду, что обьект с типом State Integer () будет являться (обёрнутой) ф-ей типа Integer -> ((), Integer), спасибо за вопрос, уточню в статье
Хорошо, спасибо, учту.
Хорошо, переформулирую
Это проект был создан а обучательных целях, конечно, его никто не будет использовать в реальных целях, в Хаскеле они просто не нужны.
Согласен с 1), но как разработчик в т. ч. на Python мне не столь критичны несколько лишних десятков миллисекунд, повторюсь этот проект в создан обучательных целях.
Со 2) думал, ничего лучше не придумал создавать тип как
VarVal = IntVal Int | StrVal String
...С 3) я разобрался используя типы
Maybe
, вот сигнатуры публичныхget
иdel
ф-ий