【问题标题】:function doesn't recognize pattern-matching函数无法识别模式匹配
【发布时间】:2014-08-04 15:21:44
【问题描述】:

我的函数 paralellenCheck 每次我调用它抱怨非详尽模式时都会引发异常

paralellenCheck定义如下:

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

我对 haskell 比较陌生,而且很困惑。我认为与[_] [][] [_] 的模式匹配应该可以解决这个问题。

【问题讨论】:

  • 尝试用_ 替换您的[_]。此外,您可能希望先提供 (x:xs) (y:ys) 的定义,然后再提供 _ _ = True 模式。
  • 这不会破坏递归吗?每个新的递归都会开始一个新的递归,然后才有机会取消 _ _

标签: haskell


【解决方案1】:

[_] 在模式中的意思是“任何一个元素的列表”。您似乎打算“根本没有任何清单”。现在,例如,[] (a:b:[]) 不匹配。对任何列表使用_

【讨论】:

  • 这不会破坏递归吗?每个新的递归都会开始一个新的递归,然后有机会通过_ _ 取消,非常感谢^^
  • 只是为了更清楚一点:你有两个空列表的模式,一个空列表,另一个长度为 1,两个长度至少为 1 的列表。缺少的是一个模式列表为空,长度大于 1。
  • @9000 所以 [_] 不涵盖任意多个案例列表的所有案例?这样的支票会是什么样子? _ 会涵盖此类列表的所有案例吗?
  • @user3763118:我不确定你的意思。我认为你可能会得到的是:第一个匹配的东西就是将要使用的那个。只要先定义 (x:xs) (y:ys) 模式,就没有问题。编辑:并回应您的第二条评论,是的;这正是我的回答所说的。
  • @MarkWhitfield 所以当xsys 是空列表时,那么x:xsy:ys 不匹配模式并尝试其他情况。这是有道理的。谢谢! ^^
猜你喜欢
  • 1970-01-01
  • 2020-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多