2

私は次の機能を使用しています:

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以前のケースに当てはまらないものは何でも処理できると思いました。

4

1 に答える 1

8

あなたのせいでl@(x:xs)ケースが欠けています。combinations' n k' l@(y:ys)combinations _ _ []

ガードnull lは常にFalse.

于 2015-05-27T19:12:25.133 に答える