2016-12-11 3 views
1

Ist es sinnvoll, Multi-Parameter-Klassen in PureScript zu haben?"Es wurde keine Klasseninstanz gefunden" in Multi-Parameter-Typ-Klasse

Der Compiler stellt eine unzumutbare ‚Kein Typ Klasseninstanz gefunden wurde‘ Fehler (siehe full output) für die unter Art Klassendefinition:

class Transform model turn where 
    transform :: turn -> model -> model 
    delay :: Maybe turn -> Int 

der Fehler aus der Definition der delay Funktion entsteht, die nicht der Fall ist hängt vom Typ model ab. Wie aus dem oben verlinkten Compiler-Ausgang hervorgeht, ersetzt er ein t0 für das abwesende Modell.

Was ist der richtige Weg, um dies zu beheben? Derzeit Abhilfe, die ich dieses Problem durch die Art der turn Wechsel wie folgt:

class Turnable model turn where 
    runTurn :: turn model -> model -> model 
    turnDelay :: Maybe (turn model) -> Int 

Antwort

1

rightfold vom FP slack Kanal gab diese Antwort:

hinzufügen fundep | turn -> model

Dann wird die Instanz nachgeschlagen nur durch turn

Folglich habe ich die Typklasse definiert ion zu diesem:

class Turnable model turn | turn -> model where 
    runTurn :: turn -> model -> model 
    turnDelay :: Maybe turn -> Int 

Dies machte den Compiler glücklich. Weitere Informationen erhalten Sie im Haskell-Wiki unter Functional dependencies (fundep) und 24 days of PureScript post.

0

... in den alten Tagen hatten wir einen Proxy (https://github.com/purescript/purescript-proxy) verwendet, um dem Compiler bei der Entscheidung zu helfen, welche Instanz er wählen sollte. z.B. :

turnDelay :: Proxy model -> turn -> Int 
turnDelay _ turn = ..... 

und nennen es in einem Proxy, indem:

turnDelay (Proxy :: Proxy FooModel) barTurn 

Ich stimme FunDeps der richtige Weg zu gehen.

Verwandte Themen