[過去ログ] 関数型プログラミング言語Haskell Part22 (1001レス)
上下前次1-新
抽出解除 レス栞
このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
341(3): 2013/03/23(土)12:40 AAS
The Glorious Glasgow Haskell Compilation System, version 7.4.2を使っています。
uniq :: Eq a => [a] -> [a]
uniq [] = []
uniq [x] = [x]
uniq (x1:xs@(x2:_)) | x1 == x2 = uniq xs
| x1 /= x2 = x1 : uniq xs
というコードを書いてコンパイルすると、
retu.hs:27:1:
Warning: Pattern match(es) are non-exhaustive
In an equation for `uniq': Patterns not matched: _ : (_ : _)
と言われます。
このuniqの定義は自分にはexhaustiveに思えるのですが、
何か見落としているのでしょうか。
343: 2013/03/23(土)12:40 AAS
>>341
こちらも、ghc 7.6.2 で問題なかった。
344: 2013/03/23(土)12:40 AAS
>>341
パターンじゃなくて、ガードに問題がある
== と /= ですべての状態をカバーしてると思われてない
uniq :: Eq a => [a] -> [a]
uniq [] = []
uniq [x] = [x]
uniq (x1:xs@(x2:_))
| x1 == x2 = uniq xs
| otherwise = x1 : uniq xs
でok
あるいは /= の実装で otherwise を使えばokかと
346: 341 2013/03/23(土)12:40 AAS
なるほど、ありがとうございます
確かに==と/=だと、それぞれの演算子の意味を解析しないと
exhaustiveかどうか分からないですからね
/=の実装がotherwiseとおっしゃっているのは、
f x | hoge x = True
| otherwise = false
notF x = not $ f x
のような実装をすればパターンマッチで判定が出来るから、
という事ですか?
上下前次1-新書関写板覧索設栞歴
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 0.044s