Techniken zum Verfolgen von Einschränkungen

Hier ist das Szenario: Ich habe Code mit einer Typensignatur geschrieben und GHC-Beschwerden konnten für einige nicht auf x ~ y schließenx undy. Normalerweise können Sie einen GHC-Bone werfen und den Isomorphismus einfach zu den Funktionseinschränkungen hinzufügen. Dies ist jedoch aus mehreren Gründen eine schlechte Idee:

Das Verständnis des Codes wird nicht betont.Sie können mit 5 Einschränkungen enden, bei denen eine ausreichend gewesen wäre (zum Beispiel, wenn die 5 durch eine spezifischere Einschränkung impliziert werden).Sie können mit falschen Einschränkungen enden, wenn Sie etwas falsch gemacht haben oder wenn GHC nicht hilfreich ist

Ich habe gerade mehrere Stunden damit verbracht, Fall 3 zu bekämpfen. Ich spiele mitsyntactic-2.0, und ich habe versucht, eine domänenunabhängige Version von zu definierenshare, ähnlich der Version inNanoFeldspar.hs.

Ich hatte das:

{-# LANGUAGE GADTs, FlexibleContexts, TypeOperators #-}
import Data.Syntactic

-- Based on NanoFeldspar.hs
data Let a where
    Let :: Let (a :-> (a -> b) :-> Full b)

share :: (Let :<: sup,
          Domain a ~ sup,
          Domain b ~ sup,
          SyntacticN (a -> (a -> b) -> b) fi) 
      => a -> (a -> b) -> a
share = sugarSym Let

und GHCcould not deduce (Internal a) ~ (Internal b), was sicher nicht das ist, wonach ich gesucht habe. Entweder hatte ich Code geschrieben, den ich nicht wollte (was die Einschränkung erforderte), oder GHC wollte diese Einschränkung aufgrund einiger anderer Einschränkungen, die ich geschrieben hatte.

Es stellte sich heraus, dass ich hinzufügen musste(Syntactic a, Syntactic b, Syntactic (a->b)) auf die Einschränkungsliste, von denen keiner impliziert(Internal a) ~ (Internal b). Ich bin im Grunde genommen auf die richtigen Einschränkungen gestoßen; Ich habe immer noch keine systematische Möglichkeit, sie zu finden.

Meine Fragen sind:

Warum hat GHC diese Einschränkung vorgeschlagen? Nirgendwo in der Syntax gibt es eine EinschränkungInternal a ~ Internal b, also woher hat GHC das gezogen?Mit welchen Techniken kann im Allgemeinen der Ursprung einer Einschränkung ermittelt werden, die nach Ansicht von GHC erforderlich ist? Auch für Zwänge, die ich habekann entdecke mich selbst, mein Ansatz ist im Wesentlichen brachial, den beleidigenden Pfad zu erzwingen, indem ich rekursive Bedingungen aufschreibe. Dieser Ansatz geht im Grunde genommen durch eine unendliche Fülle von Einschränkungen und ist die am wenigsten effiziente Methode, die ich mir vorstellen kann.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage