我刚刚开始学习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
周围创建一个“空效果包装器”。我在想这个吗?
答案 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