如何使用EXCEPTION效果从PureScript函数返回值?

时间:2016-05-22 16:28:34

标签: exception-handling effects purescript

我刚刚开始学习PureScript效果,而我却试图制作一个具有EXCEPTION效果的函数。

datetime.strptime

当我尝试运行时,我收到以下错误

无法匹配类型

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"

我理解lengthGt5需要在非异常情况下返回包含在Eff中的String,但我不确定如何在值 String with type Eff ( err :: EXCEPTION | eff0 ) String 周围创建一个“空效果包装器”。我在想这个吗?

1 个答案:

答案 0 :(得分: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是Apply的子类,定义了纯函数。纯   获取一个值并返回一个类型已被包装的值   类型构造函数f。

因此pure获取值a,并返回包含在类型构造函数中的值 - 在这种情况下,类型构造函数为Eff e