Я программирую библиотеку с зависимой типией в Haskell. Использование профилирования на моем тестовом исполняемом я вижу что-то вроде:Затраты времени на программирование с автоматическим программированием с GHC
commutativity' Math 1189 4022787186 29.1 27.2 29.1 27.2
commutativity'
является в основном (рекурсивным) доказательством коммутативности собственности целое сложения для чисел типа уровня. Она определяется следующим образом:
commutativity' :: SNat n -> SNat m -> Plus (S n) m :~: Plus n (S m)
commutativity' SZ m = Refl
commutativity' (SS n) m = gcastWith (commutativity' n m) Refl
А затем используется в моей библиотеке с gcastWith
, чтобы доказать эквивалентность различных типов.
Итак ... 29% моего времени выполнения потрачено на что-то совершенно бесполезное, так как проверка типов происходит во время компиляции.
Я наивно предположил, что этого не произойдет.
Есть ли что-то, что я могу сделать, чтобы оптимизировать эти бесполезные звонки?
Это стоимость не использования всего языка. Тип безопасности зависит от оценки доказательств в канонической форме. На всех языках доказательствам можно доверять без оценки и, таким образом, стирать во время выполнения. Вы можете воспользоваться доверием и использовать 'unsafeCoerce', как только вы проверили, что ваша программа проходит мимо typechecker. – pigworker
См. Раздел 4.4.4 «Запуск доказательств» диссертации Ричарда А. Айзенберга https://arxiv.org/abs/1610.07978 – danidiaz
Я мечтаю о GHC, интегрирующем проверку (абстрактную) проверку и автоматически оптимизируя/переписывая «доказательства» с использованием нуля - корые принуждения. Это было бы неплохо. – chi