2016-05-22 7 views
2

PureScriptエフェクトの学習を始めたばかりですが、EXCEPTIONエフェクトのある関数を作成しようとしています。EXCEPTIONエフェクトを使用してPureScript関数から値を返すにはどうすればよいですか?

私がしようとすると、私は次のエラー

がタイプ

String 

    with type 

    Eff 
     (err :: EXCEPTION 
     | eff0 
    ) 
     String 

と一致しませんでし取得、これを実行すると、私はlengthGt5が非でEffのに包まれた文字列を返す必要があることを理解し

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" 

例外ケースですが、値aの周りに "空のエフェクトラッパー"をどのように作成できるかわかりません。私はこの権利について考えていますか?

+0

ノートでは、今、HTTPS: //github.com/purescript/purescript/wiki/Differences-from-Haskell#return –

答えて

7

私は何が欠けていたのか分かりました。非例外ケースに値を返すには、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を呼び出すために持っているように定義されたのApplicative型クラスで定義され、次のとおりです。

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

のApplicativeは、適用のサブクラスであります純関数を定義します。純粋な は値を受け取り、タイプが 型コンストラクタfでラップされた値を返します。

のでpureは値aを取り、型コンストラクタに包まれた値があることを返す - この状況で型コンストラクタは `pure`がreturn``の代わりに使用されていることをEff e

関連する問題