qfw*_*wfq 7 haskell types algebraic-data-types
我有一个Haskell函数,它接受用户输入和另一个验证此输入的函数.当然,验证可能会失败,在这种情况下,我想返回一条错误消息,提供有关错误操作的一些反馈.
我知道有很多方法可以做到这一点.在我获得的小经验之后,似乎最好的方法就是使用Either String a.什么让我失望的是我不关心a.它失败了,我想存储更多信息,或者它成功.该a被浪费了.
使用Maybe String可接受的方式存储错误消息?对我来说感觉有些落后,但完全忽略了右边的价值Either感也很糟糕.什么是规范在这里?
Dan*_*ner 10
我鼓励使用Except String ()(或Either String ())结果Maybe String,原因如下:
String是电话号码时,您可能希望返回区号,第一部分和第二部分,提供类似String -> Except String (Int, Int, Int)或类似的验证类型.使得没有返回任何有趣内容的验证器具有类型Foo -> Except String ()使它们只是这种模式的特殊情况 - 因此更容易组合在一起.继续"合在一起"部分,您可能稍后发现您想要从较小的验证器中构造一个大验证器.也许你有一个验证器,可以检查一个人是否指定了一个有效的年龄和出生日期,并且想要建立一个验证器,同时检查年龄是否适合出生日期.这个Monad实例Either将有助于此; 例如:
validatePerson p now = do
age <- validateAge p
date <- validateBirthdate p
validateMatchingAgeAndDate age date now
Run Code Online (Sandbox Code Playgroud)
或者,有两种方法可以使某些值正确验证,并且您希望允许其中任何一种.然后bigValidator v = option1 v <|> option2 v是一种廉价而愉快的方式来结合两种验证方式.
作为附带好处,这些将现有验证器组合成大型验证器的方法将立即被其他Haskeller识别.
有一个非常强烈的惯例Nothing是失败.使用相反的约定不一定是一个问题,但可能会让其他贡献者感到困惑,并且可能在将来对您自己造成困扰.