Parsing 如何正确使用Haskell';s`parseTimeM`函数?
Haskell有一个函数,它取代了不推荐使用的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" "
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
forExcept
必须通过其小monad transformer堆栈底部的Identity
monad
具体地说,对于除e之外的,对于任意类型的e
,您将如何实现fail
?因为我们对e
一无所知,所以我们不能在给定字符串的情况下变出e
的值,所以fail
必须永远给您一个异常或循环
所有这些都是对Monad
类中依赖fail
的parseTimeM
风格的一个很好的反驳 但是,parseTime
现在已经被弃用了。建议?也许强制parseTimeM
返回也许UTCTime
并像以前一样处理它?@Ana:是的,我认为这是最好的解决方案。你可以依赖的fail
越少越好。