我试图更好地理解如何在 haskell 中处理错误情况,并编写了一些代码来帮助我解决这个问题。
是否有更好的方法(更优雅、更短、更通用)来处理多种替代方案(如嵌套 case 表达式)?关于该主题的任何不错的教程?
此示例的虚构类型。这有点简化,因为大多数情况下不仅有这些嵌套类型,还有只能按顺序检索的依赖值(例如,从标准输入读取一个 id,然后从数据库中检索该 id 的记录)。所以这里的嵌套应该演示这样一种情况,即只有在已经检查了外部值时,内部值才可用Nothing
。请参阅我的新问题以获取更好的示例。
type MyType = (Maybe (Maybe Int))
目标
当它小于 10 时返回 int,在其他情况下(大于或等于 10、Nothing 或 Just Nothing)返回不同的错误消息。
process Nothing ~> "error"
process (Just Nothing) ~> "error2"
process (Just (Just 20)) ~> "error3"
process (Just (Just 5)) ~> "5"
到目前为止尝试过:
天真的实施。
遭受“爬行压痕”
process :: MyType -> String
process t = case t of
Nothing -> "error"
Just a -> case a of
Nothing -> "error2"
Just b -> if b < 10 then show b else "error3"
也许功能
使用 Maybe 功能,这使它更短但也更难阅读。
process2 :: MyType -> String
process2 t = maybe "error" (\a -> maybe "error2" (\b -> if b < 10 then show b else "error3") a) t
模式匹配
迄今为止最好的解决方案,但在更复杂的情况下是不可能的(参见上面的 MyType 类型定义的注释)。
process3 :: MyType -> String
process3 Nothing = "error"
process3 (Just Nothing) = "error2"
process3 (Just (Just a))
| a < 10 = show a
| otherwise = "error3"