Sie lesen a <- m
als "zuweisen a
den Wert m
." Diese Notation für die Zuweisung ist im Pseudocode üblich, bedeutet aber in Haskell etwas anderes. Sie können es lesen als "Produzieren Sie einen Wert von m
und binden Sie diesen Wert an a
." Um genauer zu sein, in einem do
Block,
a <- m
...
...
entspricht
m >>= \a ->
do
...
...
So Anwendung Right
-a
sinnvoll ist, aber es m
gibt Ihnen eine monadische Aktion eingewickelt in Either
Anwendung, die ist normalerweise nicht das, wonach du suchst.
Es ist jedoch ein kürzerer Weg, um dieses Beispiel zu schreiben:
instance Error e => MonadTrans (ErrorT e) where
lift m = ErrorT (Right <$> m)
Nota Bene: ErrorT
hat im Allgemeinen durch die mehr allgemein nützlichen ExceptT
verdrängt worden, was nicht die lästige hat und oft irrelevant Error
Kontext. Insbesondere ist es oft nützlich, einen "Ausnahme" -Wert zu haben, der eigentlich keinen Fehler darstellt und keine Instanz von Show
ist.
Von Ihrem ersten Stück Code: 'zurück (Right m) :: * m * (Entweder e (ma))' Ich kann nicht verstehen, warum es m ist (ich hob es durch * m *) und nicht zum Beispiel 'ErrorT' – Gilgamesz
@Gilgamesz Sie sind richtig: dass es eigentlich' n (Entweder e (ma)) 'für jede Monade' n' ist, die sich von 'm' unterscheiden kann. Das Endergebnis wäre dann "ErrorT ... :: ErrorT en (ma)", aber da "lift" 'ErrorT ema' zurückgeben muss, erzwingt dies" n = m "(und' ma = a', was unmöglich ist und löst einen Typfehler aus). Ich habe 'n = m' früher angewendet und bin etwas weniger allgemein. (und aus dem gleichen Grund sollte 'Right a'' entweder za' für alle 'z' sein, einschließlich denen, die sich von' e' unterscheiden, aber schließlich muss 'z' sowieso' e' sein) – chi
Danke guten Mann :) – Gilgamesz