Полный (функциональный) язык - это тот, в котором все может быть прекращено. Очевидно, что есть много мест, где я не хочу этого - иногда бывает полезно исключать исключения, веб-сервер не должен заканчиваться и т.д. Но иногда мне нужна локальная проверка совокупности, чтобы включить определенные оптимизации. Например, если у меня есть доказуемо общая функция
commutativity :: forall (n :: Nat) (m :: Nat). n + m :~: m + n
commutativity = ...
то, поскольку :~:
имеет ровно один житель (Refl
), GHC может оптимизировать
gcastWith (commutativity @n @m) someExpression
==>
someExpression
И мое доказательство коммутативности связано с тем, что стоимость выполнения O(n)
является бесплатной. Итак, теперь для моего вопроса:
Каковы некоторые из тонких трудностей при создании проверки целостности для Haskell?
Очевидно, что такая контрольная панель консервативна, поэтому всякий раз, когда GHC не уверен, что что-то является тотальным (или нужно лениться проверять), он может предположить, что это не так... Похоже на то, что мне может быть не так сложно сгибаться вместе не очень умный контролер, который все равно будет очень полезен (по крайней мере, это должно быть просто, чтобы устранить все мои арифметические доказательства). Тем не менее, я не могу найти никаких попыток построить такую вещь в GHC, поэтому, очевидно, я пропускаю некоторые довольно большие ограничения. Идите вперед, раздавите мои мечты.:)
Релевантно, но не последнее: Неудачный Haskell от Neil Mitchell, 2005.