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?