gpt4 book ai didi

Haskell:为什么模式匹配即使编译和执行也不是详尽无遗的?

转载 作者:行者123 更新时间:2023-12-03 10:00:18 24 4
gpt4 key购买 nike

学习 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com