【问题标题】:Non-exhaustive patterns in function max函数 max 中的非详尽模式
【发布时间】:2015-07-22 21:48:35
【问题描述】:

在 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) 上按预期工作:

【问题讨论】:

  • 您的屏幕截图中没有:{:}
  • 现在看起来是正确的。我有点困惑为什么它没有插入“前奏|”虽然在每一行之前。也许 WinGHCi 和多行模式和/或粘贴之间存在一些奇怪的交互。
  • 我使用 WinGHCi,但我一直无法将多行粘贴到其中。

标签: haskell ghci winghci


【解决方案1】:

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

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

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

【讨论】:

  • 您也可以用;分隔定义,将其写在一行上。
  • @sepp2k 尝试了您的代码,包括进入多行模式但收到错误:“:74:56: parse error on input ‘=’”
  • @blue-sky 我也是,我没有。好奇的。您是否添加了任何额外的缩进?错误出现在哪一行?
  • @sepp2k 我已经用屏幕截图更新了问题,ghci 版本是否相同?
  • 或者使用:set +m 来允许多行定义。 (或者使用IHaskellJupyter内核)
【解决方案2】:

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 确实允许你定义一个具有多种模式的函数,你只需要写一次let。但更重要的是 GHCi 不允许您编写占用多行的代码,除非您使用 :{:}。所以你的建议没有那个也行不通。
猜你喜欢
  • 2021-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多