К тому времени, когда я впервые прочитал серьезный criticism on -XUndecidableInstances
, я уже полностью привык к этому, рассматривая его как просто удаление раздражающего ограничения. Haskell98 должен сделать компиляторы проще для реализации.Как можно разблокировать экземпляры на самом деле повесить компилятор?
Фактически, я столкнулся с множеством приложений, где нужны нерешимые экземпляры, но не там, где они фактически вызвали проблемы, связанные с неразрешимостью. Пример Луки является проблематичным для совершенно иной причине
class Group g where
(%) :: g -> g -> g
...
instance Num g => Group g where
...
- ну, это, безусловно, будет перекрывается любым надлежащим Group
, например, так неразрешимость является наименее нашего беспокойства: это на самом деле ООН детерминированным!
Но, честно говоря, я с тех пор держал «неразрешимые экземпляры, возможно, повесить компилятор» в затылок.
Откуда он был приобретен, когда я прочитал this challenge on CodeGolf.SE, запросив код, который будет бесконечно зависать компилятором. Ну, звучит как работа для неразрешимых экземпляров, не так ли?
Оказывается, я не могу заставить их это сделать. Следующие компилирует в кратчайшие сроки, по крайней мере, из GHC-7.10:
{-# LANGUAGE FlexibleInstances, UndecidableInstances #-}
class C y
instance C y => C y
main = return()
Я могу даже использовать методы класса, и они будут вызывать только петлю на выполнения:
{-# LANGUAGE FlexibleInstances, UndecidableInstances #-}
class C y where y::y
instance C y => C y where y=z
z :: C y=>y; z=y
main = print (y :: Int)
Но во время выполнения петли ничего необычного, вы можете легко скопировать их в Haskell98.
Я также попробовал разные, менее прямые петли, такие как
{-# LANGUAGE FlexibleContexts, UndecidableInstances #-}
data A x=A
data B x=B
class C y
instance C (A x) => C (B x)
instance C (B x) => C (A x)
Опять же, никаких проблем во время компиляции.
Итак, что на самом деле необходимо, чтобы повесить компилятор в разрешении экземпляров класса unesableable type?
Возможно, вам нужно что-то сделать, чтобы заставить компилятор решить, является ли 'Int' экземпляром' C'. – immibis