2016-05-22 38 views
2

我刚开始学习关于PureScript效果的知识,并且我试图制作一个具有EXCEPTION效果的函数。如何使用EXCEPTION效果从PureScript函数返回值?

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" 

当我尝试和运行此我得到以下错误

无法比拟型

String 

    with type 

    Eff 
     (err :: EXCEPTION 
     | eff0 
    ) 
     String 

我明白lengthGt5需要返回包裹在一个Eff为在非字符串异常的情况下,但我不知道如何创建一个值为a的“空效果包装”。我在想这个权利吗?

+0

注意'pure'是代替'return'现在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被定义为应用型类型的类定义如下:

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

应用型是应用的一个子类并定义纯函数。纯粹的 取值并返回一个值,其类型已经用 类型的构造函数f封装。

所以pure取值a,并返回包裹在一个类型构造函数值 - 在这种情况下类型构造是Eff e