【问题标题】:Haskell non-exhaustive patterns in function with `otherwise`Haskell 函数中的非穷举模式与“否则”
【发布时间】:2015-05-27 19:09:45
【问题描述】:

我正在使用以下功能:

combinations :: Int -> [a] -> [[a]]
combinations k xs = combinations' (length xs) k xs
  where combinations' n k' l@(y:ys)
          | k' == 0   = [[]]
          | k' >= n   = [l]
          | null l    = []
          | otherwise = Prelude.map (y :) (combinations' (n - 1) (k' - 1) ys) ++ combinations' (n - 1) k' ys 

对于我能想到的任何示例,它都可以正常工作,但是当我从较大项目中的其他函数调用它时,在某些情况下我会遇到异常:

Exception: projekt.hs:(34,9)-(38,108): Non-exhaustive patterns in function combinations'

上面的定义有问题吗?它是否缺少某些案例?我认为otherwise 处理任何不属于以前案例的事情。

【问题讨论】:

  • otherwise 处理任何不属于以前的守卫的东西——但不会使模式匹配支持其他case
  • 您可以通过将l@(y:ys) 更改为l@ ~(y:ys) 进行非常小的编辑来解决此问题,从而使模式变得懒惰且无可辩驳(因此也接受空列表)。不过,我建议不要使用这种样式,它会使代码过于脆弱且不明显。

标签: haskell combinations non-exhaustive-patterns


【解决方案1】:

由于l@(x:xs) 中的combinations' n k' l@(y:ys),您错过了combinations _ _ [] 的情况。

守卫null l 将永远是False

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多