Sì, so che UndecidableInstances
può essere cattivo. Ho davvero cercato di progettare il mio modulo in modo che esso non ne ha bisogno però ho qualcosa di simile:Come utilizzare UndecidableInstances localmente?
instance Foo x (C x y) => Bar (C x y) where
...
e la modifica renderebbe l'API sostanzialmente più brutto. Non ho mai derivato Foo
di Bar
quindi non c'è modo di creare un loop.
D'altra parte abilitare UndecidableInstances
rende facile ignorare gli errori stupidi. Per esempio potrei scrivere per sbaglio qualcosa del tipo:
instance Foo x (C x z) => Bar (C x y) where
...
dove z
compare mai sul lato destro.
Domanda: È possibile utilizzare localmente UndecidableInstances
in un modulo, ovvero contrassegnare in modo esplicito i luoghi in cui vengono eliminate le normali regole di terminazione?
Ovviamente non sarà di aiuto con la terminazione, ma renderà la decisione di utilizzare questa estensione più informata.
Domanda 2: C'è qualcosa di più debole di UndecidableInstances
che ancora non garantirebbe di terminazione, ma sarebbe vietare alcuni altri casi border-line, come il secondo frammento di codice?