кто такой бренд
s в ST s a это не костыляция, а использование по прямому назначению экзистенциальных типов для выражения области видимости нити стейта
ЕМНИП так называется связь между типами такая: a = machine b = machine a_task :: Task ('brand a) = nextTask a b_task :: Task ('brand b) = nextTask b executeTask a_task a -- OK executeTask b_task a -- compilation error, b_task have brand b instead of a
это больше всего похоже просто на фантомные типы, сам по себе фантомный тип не дает той гарантии, что дает экзистенциал в runST
Мне это показалось костыляцией из-за того, что не понятно, что на практике будет подставлятся на месте s, а я ожидаю что на месте дженерика всегда что-то подставляется (возможно здесь я не прав, это у меня из других языков)
в этом вся задумка, мы не знаем что туда подставляется и поэтому мы не можем это подставить
я эту фичу языка/тайп системы слышал под названием "бренды" (brands), откуда уже не помню, вроде на языках с зависимыми типами тривиально реализуется
то есть оно так и компилируется без подставленного (выведенного) дженерика?
Там деталь реализации, что именно подставляется (по-моему что-то вроде Any), но логически ты можешь на это смотреть как на подстановку сгенерированной компилятором уникальной метки, уникальная для каждого вызова runST.
вот это именно что бренды
но для runST/ST в компиляторе нет специальных случаев?
да ты бы хоть дал нам определние этих брендов если повторять одно и то же название много раз, его смысл яснее не станет
можешь хоть сам такое написать
Обсуждают сегодня