2016-05-22 6 views
2

Ich habe gerade angefangen, über PureScript-Effekte zu lernen, und ich versuche, eine Funktion zu erstellen, die einen AUSNAHME-Effekt hat.Wie gebe ich einen Wert aus einer PureScript-Funktion mit einem EXCEPTION-Effekt zurück?

lengthGt5 :: forall eff. String -> Eff (err :: EXCEPTION | eff) String 
lengthGt5 a = if (length a <= 5) 
       then throwException $ error "Word is not the right length!" 
       else a 

main = do 
    word <- catchException handleShortWord (lengthGt5 "test") 
    log word 

    where 
    handleShortWord err = do 
     log (message err) 
     return "Defaut::casserole" 

Wenn ich versuche, und führen Sie diese ich die folgende Fehlermeldung erhalten

Typ konnte nicht

String 

    with type 

    Eff 
     (err :: EXCEPTION 
     | eff0 
    ) 
     String 

übereinstimmen Ich verstehe, dass lengthGt5 einen String in einem Eff in den nicht eingewickelt zurückgeben muss Ausnahmefall, aber ich bin mir nicht sicher, wie ich einen "leeren Effekt-Wrapper" um den Wert a erstellen kann. Denke ich über dieses Recht nach?

+0

Beachten Sie, dass 'pure' anstelle von' return' jetzt verwendet wird, https: //github.com/purescript/purescript/wiki/Unterschiede-von-Haskell#return –

Antwort

7

Ich habe herausgefunden, was ich vermisst habe. Um den Wert der Nicht-Ausnahmefall zurückkehren, müssen Sie rufen pure a

lengthGt5 :: forall eff. String -> Eff (err :: EXCEPTION | eff) String 
lengthGt5 a = if (length a <= 5) 
       then throwException $ error "Word is not the right length!" 
       else (pure a) 

pure im Applicative Typklasse definiert ist wie folgt definiert:

class (Apply f) <= Applicative f where 
    pure :: forall a. a -> f a 

Applicative ist eine Unterklasse von Nehmen und definiert die reine Funktion. pure nimmt einen Wert und gibt einen Wert zurück, dessen Typ mit dem Konstruktor f umbrochen wurde.

So nimmt pure den Wert a und gibt diesen Wert in einem Typkonstruktor gewickelt - in dieser Situation die Typkonstruktor ist Eff e

Verwandte Themen