Wenn ich versuche, dies zu kompilieren:Haskell: „Kann nicht ableiten“ Fehler mit runST
module Main where
import qualified Data.Vector.Unboxed.Mutable as MV
import Control.Monad.ST
myRead mv = runST $ MV.read mv 0
bekomme ich folgende Fehlermeldung:
Could not deduce (t ~ U.MVector s a)
from the context (U.Unbox a)
bound by the inferred type of myRead :: U.Unbox a => t -> a
at src/Main.hs:53:1-32
`t' is a rigid type variable bound by
the inferred type of myRead :: U.Unbox a => t -> a
at src/Main.hs:53:1
Expected type: U.MVector (PrimState (ST s)) a
Actual type: t
In the first argument of `MV.read', namely `mv'
In the second argument of `($)', namely `MV.read mv 0'
In the expression: runST $ MV.read mv 0
Kann ich einen Lesevorgang von einem wandelbaren Vektor machen rein mit runST? Wenn das so ist, wie? Ich nehme an, dass es eine Typ-Signatur für myRead
enthält, aber alles, was ich versucht habe, hat nur zu mehr und mehr unverständlichen Fehlermeldungen geführt.
EDIT: einige Kontext Hervorhebungen ich unten in einem Kommentar setzen gerade: Der Kontext ist hier, dass ich eine Funktion haben, die in einem wandelbaren Vektor nimmt, hat einige Berechnungen der wandelbaren Vektor als temporäre Scratch-Bereich verwendet wird, dann braucht um einen Gleitkommawert zurückzugeben. Da mir die Änderungen am veränderbaren Vektor egal sind, habe ich mich gefragt, ob es eine Möglichkeit gibt, die "Zustandsänderung" zu ignorieren und einfach einen der Werte aus dem Inneren des Vektors zurückzugeben.
Ich denke, die Meinung der Weisen, nämlich Breitner und Fischer, ist, dass wir mehr darüber wissen müssen, wie Sie zu diesem Punkt gekommen sind. Welche Funktion erzeugt den veränderbaren Vektor, auf den Sie myRead anwenden möchten? Siehe den letzten Satz in Breitners Antwort. Wenn wir wüssten, was dich in diese Ecke bringt, könnten wir sagen, wie man Dinge neu analysiert, damit sie zusammenhängen. Ein paar weitere Zeilen Code wären daher hilfreich. Wenn sich beispielsweise "mv" in einem ST-Block befindet, könnte die einfachere Definition "myRead mv = MV.read mv 0" (kein "runST") verwendet werden. – applicative
Lassen Sie mich verstärken, was anwendungs gesagt: Wir brauchen mehr Kontext. Ohne zu wissen, was Sie eigentlich erreichen wollen, können wir keine geeignete Lösung finden. –