Parsing 如何正确使用Haskell';s`parseTimeM`函数?

Parsing 如何正确使用Haskell';s`parseTimeM`函数?,parsing,haskell,time,Parsing,Haskell,Time,Haskell有一个函数,它取代了不推荐使用的parseTime函数。我认为前者优于后者的原因是,它在报告解析错误方面具有更好的灵活性。它可以在封闭的monad上调用fail,而不是Maybe 所以我试过了。首先,不推荐使用的函数: > parseTime defaultTimeLocale "%Y" "2015" :: Maybe UTCTime Just 2015-01-01 00:00:00 UTC > parseTime defaultTimeLocale "%Y" "

Haskell有一个函数,它取代了不推荐使用的
parseTime
函数。我认为前者优于后者的原因是,它在报告解析错误方面具有更好的灵活性。它可以在封闭的monad上调用
fail
,而不是
Maybe

所以我试过了。首先,不推荐使用的函数:

> parseTime defaultTimeLocale  "%Y" "2015" :: Maybe UTCTime
Just 2015-01-01 00:00:00 UTC

> parseTime defaultTimeLocale  "%Y" "201x" :: Maybe UTCTime
Nothing
太好了。正如所料。然后,
Identity
monad:

> runIdentity $ parseTimeM  False defaultTimeLocale  "%Y" "2015" :: UTCTime
2015-01-01 00:00:00 UTC

> runIdentity $ parseTimeM  False defaultTimeLocale  "%Y" "201x" :: UTCTime
*** Exception: parseTimeM: no parse of "201x"
由于
Identity
monad没有优雅的故障模式,这也是意料之中的。但是,我认为除了monad之外,
与monad有些不同,monad的目的是优雅地捕捉错误

> runExcept $ parseTimeM  False defaultTimeLocale  "%Y" "2015" :: Either () UTCTime
Right 2015-01-01 00:00:00 UTC

> runExcept $ parseTimeM  False defaultTimeLocale  "%Y" "201x" :: Either () UTCTime
*** Exception: parseTimeM: no parse of "201y"

为什么在这里抛出异常?它不应该返回
Left()
?我如何像我认为应该的那样解析时间,也就是说,如果要解析的字符串格式不正确,则优雅地返回一个错误?

,除了
mtl
的一部分,后者是monad transformer库。transformers的常用样式是为某些行为定义transformer(
ExceptT
),并将基本版本表示为类型同义词:

type Except e = ExceptT e Identity
因此,您可能会得到一个异常,因为
fail
for
Except
必须通过其小monad transformer堆栈底部的
Identity
monad

具体地说,对于除e之外的
,对于任意类型的
e
,您将如何实现
fail
?因为我们对
e
一无所知,所以我们不能在给定字符串的情况下变出
e
的值,所以
fail
必须永远给您一个异常或循环


所有这些都是对
Monad
类中依赖
fail
parseTimeM
风格的一个很好的反驳

但是,
parseTime
现在已经被弃用了。建议?也许强制
parseTimeM
返回
也许UTCTime
并像以前一样处理它?@Ana:是的,我认为这是最好的解决方案。你可以依赖的
fail
越少越好。