merge [] [] = -6ren">
gpt4 book ai didi

haskell - 又一个 'Non-exhaustive patterns in function'

转载 作者:行者123 更新时间:2023-12-02 16:36:02 27 4
gpt4 key购买 nike

初学者 Haskell 问题。实际上我发现了非常相似的问题Haskell error: "non-exhaustive patterns"

交互式外壳:

Prelude> merge [] [] = []
Prelude> merge (x:xs) [] = x:xs
Prelude> merge [] (y:ys) = y:ys
Prelude> -- merge (x:xs) (y:ys)

Prelude> merge [][]
Exception
Prelude> merge [0][]
Exception: <interactive>:3:1-22: Non-exhaustive patterns in function merge

Prelude> merger [][0]
OK

事实上非交互模式下也存在异常

main = do
print (merge [1,2,3] [])
print (merge [] [1,2,3])
print (merge [] [])


merge :: (Ord a) => [a] -> [a] -> [a]
merge (x:xs) [] = x:xs
merge [] (y:ys) = y:ys
merge [][] = []

但是,这取决于出现错误的合并特殊情况的细节顺序。我真的不知道为什么会发生这种情况。提前致谢。

最佳答案

这里有两个单独的问题。

您不可能在 GHCi 中以这种方式定义 merge(感谢 Alec 的更正!)

第一个问题仅发生在交互式 session 中,即您正在定义三个个名为merge的独立函数,其中每个阴影 上一篇。请参阅here对于与您有非常相似问题的人。

要输入单个多行定义,必须使用 :{:}:

Prelude> :{
Prelude| merge [] [] = []
Prelude| merge (x:xs) [] = x:xs
Prelude| merge [] (y:ys) = y:ys
Prelude| -- merge (x:xs) (y:ys)
Prelude| :}
Prelude>

但是,一般来说,在 GHCi 中输入多行定义是相当不愉快的,因此您最好将定义存储到普通的 .hs 文件中,然后将此文件加载到 GHCi 中。

<小时/>

第二个问题,在交互式 session 和非交互式程序中都会发生,是您对 merge 的定义并不详尽:两个列表参数都非空的情况是' t 处理。请注意:

  • 如果任一列表参数为空,merge 必须返回另一个列表。
  • 如果两个列表均非空,merge 必须提取最小的头元素(在任一列表中),然后递归合并其余元素。

因此,merge 的正确定义是:

Prelude> :{
Prelude| merge xs [] = xs
Prelude| merge [] ys = ys
Prelude| merge xxs@(x:xs) yys@(y:ys)
Prelude| | x <= y = x : merge xs yys
Prelude| | otherwise = y : merge xxs ys
Prelude| :}
Prelude> merge [1,3..9] [2,4..10]
[1,2,3,4,5,6,7,8,9,10]
Prelude>

或者,非交互方式:

merge xs [] = xs
merge [] ys = ys
merge xxs@(x:xs) yys@(y:ys)
| x <= y = x : merge xs yys
| otherwise = y : merge xxs ys

关于haskell - 又一个 'Non-exhaustive patterns in function',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42183896/

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