Haskell 函数不';无法识别模式匹配
我的函数Haskell 函数不';无法识别模式匹配,haskell,Haskell,我的函数parallelEncheck每次调用时都会抛出一个异常,抱怨非穷举模式 并行检查的定义如下: paralellenCheck :: (Eq a, Num a ) => [a] -> [a] -> Bool paralellenCheck [] [] = True paralellenCheck [_] [] = True paralellenCheck [] [_] = True paralellenCheck (x:xs) (y:ys) | intervall
parallelEncheck
每次调用时都会抛出一个异常,抱怨非穷举模式
并行检查
的定义如下:
paralellenCheck :: (Eq a, Num a ) => [a] -> [a] -> Bool
paralellenCheck [] [] = True
paralellenCheck [_] [] = True
paralellenCheck [] [_] = True
paralellenCheck (x:xs) (y:ys)
| intervall `elem` [0,5,7,12] = False
| not $ paralellenCheck (x:xs) ys = False
| not $ paralellenCheck xs (y:ys) = False
| otherwise = True
where intervall = abs (x - y)
在应用了-Wall的GHCI中运行函数只会返回
<interactive>:10:1:
Warning: Defaulting the following constraint(s) to type `Integer'
(Eq a0)
arising from a use of `paralellenCheck' at <interactive>:10:1-15
(Num a0)
arising from a use of `paralellenCheck' at <interactive>:10:1-15
In the expression: paralellenCheck [] [2, 3, 4, 5]
In an equation for `it': it = paralellenCheck [] [2, 3, 4, ....]
<interactive>:10:1:
Warning: Defaulting the following constraint(s) to type `Integer'
(Eq a0)
arising from a use of `paralellenCheck' at <interactive>:10:1-15
(Num a0)
arising from a use of `paralellenCheck' at <interactive>:10:1-15
In the expression: paralellenCheck [] [2, 3, 4, 5]
In an equation for `it': it = paralellenCheck [] [2, 3, 4, ....]
*** Exception: haskelltest.hs:(6,1)-(14,31): Non-exhaustive patterns in function paralellenCheck
:10:1:
警告:将以下约束默认为“整型”
(等式a0)
因在10:1-15使用“平行检查”而产生
(数量a0)
因在10:1-15使用“平行检查”而产生
在表达式中:paralelencheck[][2,3,4,5]
在‘it’的方程式中:it=paralelencheck[][2,3,4,…]
:10:1:
警告:将以下约束默认为“整型”
(等式a0)
因在10:1-15使用“平行检查”而产生
(数量a0)
因在10:1-15使用“平行检查”而产生
在表达式中:paralelencheck[][2,3,4,5]
在‘it’的方程式中:it=paralelencheck[][2,3,4,…]
***例外:haskelltest.hs:(6,1)-(14,31):函数并行检查中的非穷举模式
我对哈斯克尔很陌生,也很困惑。我认为与
[[u][]]
和[[[u]
匹配的模式应该可以解决这个问题。[[u]
在模式中意味着“恰好包含一个元素的任何列表”。你似乎想要“任何清单”。例如,现在,[](a:b:[])
不匹配。对任何列表使用
。[\u]
在模式中表示“恰好包含一个元素的任何列表”。你似乎想要“任何清单”。例如,现在,[](a:b:[])
不匹配。对任何列表使用
。尝试将您的[\u]
替换为
。另外,您可能希望首先提供(x:xs)(y:ys)
的定义,然后再提供\uuu=True
模式。这不会破坏递归吗?每一个新的递归都会在有机会取消之前启动一个新的递归,请尝试将您的[\u]
替换为
。另外,您可能希望首先提供(x:xs)(y:ys)
的定义,然后再提供\uuu=True
模式。这不会破坏递归吗?每一个新的递归都会在有机会通过\uuu
取消之前启动一个新的递归,但这不会破坏递归吗?每一个新的递归都会在有机会通过\uuuu
取消之前启动一个新的递归。另外,非常感谢^^^^只是为了让它更清楚:两个空列表都有模式,一个列表为空,另一个列表的长度为1,两个列表的长度至少为1。缺少的是一个列表为空,另一个大于1的模式。@9000所以对于一个包含任意多个事例的列表,[\ux]不能覆盖所有事例?这样的支票是什么样子的?\u
会涵盖这样一个列表的所有情况吗?@user3763118:我不知道你的意思。我想你可能得到的是:第一个匹配的mattern将被使用。只要先定义(x:xs)(y:ys)模式,就不会有问题。编辑:对于你的第二条评论,是的;这正是我的答案。@MarkWhitfield所以当xs
或ys
为空列表时,x:xs
和y:ys
不匹配模式,其他情况将被尝试。这是有道理的。谢谢^^这不会破坏递归吗?每一个新的递归都会在有机会通过\uuuu
取消之前启动一个新的递归。另外,非常感谢^^^^只是为了让它更清楚:两个空列表都有模式,一个列表为空,另一个列表的长度为1,两个列表的长度至少为1。缺少的是一个列表为空,另一个大于1的模式。@9000所以对于一个包含任意多个事例的列表,[\ux]不能覆盖所有事例?这样的支票是什么样子的?\u
会涵盖这样一个列表的所有情况吗?@user3763118:我不知道你的意思。我想你可能得到的是:第一个匹配的mattern将被使用。只要先定义(x:xs)(y:ys)模式,就不会有问题。编辑:对于你的第二条评论,是的;这正是我的答案。@MarkWhitfield所以当xs
或ys
为空列表时,x:xs
和y:ys
不匹配模式,其他情况将被尝试。这是有道理的。谢谢^^