2 Stimmen

Was bedeutet der Fehler `Could not deduce (a ~ b)`?

Ich ändere den folgenden Code im Rahmen einer Aufgabe:

rand :: Random a => State StdGen a
rand = do
    gen <- get
    let (x, gen') = random gen
    put gen'
    return x

Ich wurde gebeten, eine Funktion randR zu schreiben, die dieselbe Aufgabe wie die Funktion rand erfüllt, aber eine Reichweite zulässt. Der gewünschte Typ ist Random a => (a, a) -> State StdGen a. Ich habe den folgenden Code geschrieben:

randR :: Random a => (a, a) -> State StdGen b
randR (lo, hi) = do
    gen <- get
    let (x, gen') = randomR (lo, hi) gen
    put gen'
    return x

Dies sieht richtig aus; es ist fast genau wie das Modell. Aber ich erhalte den folgenden Fehler:

Konnte nicht ableiten (a ~ b)
aus dem Kontext (Random a)
  begrenzt durch die Typsignatur für 
             randR :: Random a => (a, a) -> State StdGen b

Was bedeutet (a ~ b) und warum kann der Compiler es nicht aus dem "Kontext" ableiten?

7voto

Christian Conkle Punkte 5922

Die Fehlermeldung zeigt an, dass es einen Tippfehler in der Signatur für randR gibt: randR :: Random a => (a, a) -> State StdGen b. Es sollte ... -> RandState a sein.

Die Nachricht besagt ungefähr, dass der Compiler weiß, dass a und b den gleichen Typ haben müssen, aber das nicht beweisen kann. a ~ b ist eine "Gleichheitsconstraint"; lesen Sie ~ ungefähr als =.

Der Teil über den Kontext ist einfach die Art des Compilers, Ihnen mitzuteilen, was er über die Typenrestriktionen weiß. In diesem Fall ist es fast vollständig unhilfreich, aber häufig sehen Sie etwas wie Konnte nicht ableiten (Floating a) aus dem Kontext (Num a) oder eine andere klare Angabe, dass die Funktion eine zusätzliche Einschränkung benötigt.

Zufällig könnten Sie dieses Problem mit einigen Erweiterungen beheben, indem Sie die von GHC geforderte Einschränkung hinzufügen: randR :: (Random a, a ~ b) => (a, a) -> State StdGen b sollte gut funktionieren. (Glaube ich zumindest.) Für Ihre Zwecke machen Sie sich keine Gedanken darüber...

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X