作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
学习 Haskell,对这里的代码提示有点困惑:
getMax :: [Int] -> Int
getMax [a] = a
getMax (a:b:as) = getMax ((if a >= b then a else b):as)
Pattern match(es) are non-exhaustive
In an equation for ‘getMax’: Patterns not matched: []
它有效并找到例如 [5, 2, 6]
的最大值。是否需要空列表的模式?那么合理的返回值是多少呢?零?我可以返回类似 undefined
的东西吗?
最佳答案
Does it need a pattern for the empty list?
不是本身,因为它只是一个警告。只要您从不向它传递空列表,它就可以正常工作。但是,由您来检查它,您永远无法确定是否会以某种方式传递一个空列表。
What's a reasonable return value then? Zero? Can I return something like
undefined
?
这当然由您决定。您可能想要区分空列表和非空列表的结果。因此在 Haskell 中通常使用 Maybe
。例如:
getMax :: [Int] -> <b>Maybe</b> Int
getMax [] = <b>Nothing</b>
getMax [a] = <b>Just</b> a
getMax (a:b:as) = getMax ((if a >= b then a else b):as)
或者您可以更改输入,例如不可能传递非空列表。我们可以在这里使用两个参数,因此签名是 getMax::Int -> [Int] -> Int
。这里第一个参数是列表的“头”,第二个是列表的尾:
getMax :: <b>Int</b> -> [Int] -> Int
getMax a [] = a
getMax a (b:as) = getMax (if a >= b then a else b) as
使用 undefined
通常不是一个好主意。是的,我们不再有一个非详尽的模式,但是评估 undefined
会引发错误。所以它只是用一个问题换取另一个问题。
关于Haskell:为什么模式匹配即使编译和执行也不是详尽无遗的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58466097/
我是一名优秀的程序员,十分优秀!