19

「不可能」な場合でも、Haskell で常に徹底的なパターン マッチを行うことをお勧めしますか?

たとえば、次のコードでは、foldr の「accumulator」でパターン マッチングを行っています。アキュムレータを作成するため、アキュムレータの内容を完全に制御できます (入力として渡されるのではなく、関数内に構築されます)。したがって、特定のパターンが決して一致してはならないことを知っています。「パターン一致は網羅的ではありません」というエラーが発生しないように努める場合は、「このパターンは発生しないはずです」というメッセージとともに単純にエラーになるパターン一致を配置します。C# の assert によく似ています。そこで他にやることは思いつきません。

この状況で推奨されるプラクティスとその理由は何ですか?

コードは次のとおりです。

gb_groupBy p input = foldr step [] input
   where
      step item acc = case acc of
           []                           -> [[item]]
           ((x:xs):ys)                  -> if p x item
                                           then (item:x:xs):ys
                                           else [item]:acc

一致しないパターン (インタープリターによって報告される) は次のとおりです。

警告: パターン マッチは網羅的ではありません 代替ケース: パターンがマッチしません: [] : _

4

6 に答える 6

21

これはおそらく何よりもスタイルの問題です。個人的には、

_ -> error "Impossible! Empty list in step"

警告を黙らせるだけなら:)

于 2009-05-07T05:23:25.777 に答える
2

型システムはあなたの友人であり、警告は関数にクラックがあることを知らせています。最良のアプローチは、タイプ間をよりクリーンでエレガントに適合させることです。

のghcの定義を考えてみましょうgroupBy

groupBy                 :: (a -> a -> Bool) -> [a] -> [[a]]
groupBy _  []           =  []
groupBy eq (x:xs)       =  (x:ys) : groupBy eq zs
                           where (ys,zs) = span (eq x) xs
于 2010-01-27T18:11:17.463 に答える
1

私の見解では、不可能なケースはundefinedです。
未定義の場合、関数があります: 狡猾な名前のundefined.

次のようなものでマッチングを完了してください:

_ -> undefined

そして、あなたはそれを持っています!

于 2014-04-22T10:56:24.683 に答える