函数 max 中的非详尽模式

Non-exhaustive patterns in function max

在 ghci 中这个代码:

let max [] = error "maximum of empty list"  

let max [x] = x  

let max (x:xs)   
    | x > maxTail = x  
    | otherwise = maxTail  
    where maxTail = max xs 

导致错误:*** Exception: <interactive>:26:5-106: Non-exhaustive patterns in function max

这里的不竭格局是什么?满足零元素、单元素和多元素列表 ?

更新:

更新 2:

更新 3:

在 Debian 上按预期工作 (Raspberry Pi):

GHCi(通常 let)不允许您以这种方式定义函数。您只需定义 3 个函数,每次都用另一个函数覆盖。

如果您想继续使用 GHCi,请这样写:

let max list = case list of
    [] -> error "maximum of empty list"  
    [x] -> x  
    (x:xs) -> 
      if x > maxTail then x else maxTail  
      where maxTail = max xs 

通过使用三个单独的 let,您定义了三个单独的、非详尽无遗的函数,名为 max,每个函数都覆盖了之前的函数。为了使用 let 定义多案例函数,您可以使用 let 关键字 ones,然后在每个模式的相同缩进处重复函数签名,如下所示:

let max [] = error "maximum of empty list"
    max [x] = x
    max (x:xs)
      | x > maxTail = x
      | otherwise = maxTail
      where maxTail = max xs

为了让这个(或任何其他占用多行的代码)在 GHCI 中工作,您需要通过输入 :{ 来启动多行模式,然后使用:} 或使用 ; 而不是换行符将其全部写在一行中(除了在 | 之前你只写 | 没有 ; 或行在前面突破)。