リストを再帰的に繰り返して、すべての値が0に等しいかどうかを確認しようとすると、次のエラーが発生します。
* Couldn't match expected type `[Integer]' with actual type `Bool'
* In the second argument of `(:)', namely `allZero s'
In the expression: 0 : allZero s
In an equation for `allZero': allZero (0 : s) = 0 : allZero s
私のコードは次のとおりです。
allZero :: [Int] -> Bool
allZero (0:_) = True
allZero (0:s) = 0 : allZero s
allZero (_:s) = False;
allZero _ = False
なぜこのエラーが発生するのかわかりません。allZero (0:s) = 0 : allZero s
正しいパラメータを指定している行に、リスト「s」があります。
エラーと解決策を説明しようと思います。解決策は次のとおりです。
allZero :: [Int] -> Bool
allZero [] = True
allZero (x:xs) = (x == 0) && (allZero xs)
2つのパターンを考えてください。まず、要素がない場合、すべてが0であり、意味があります[]
。これが最初のパターンです。2番目のパターンでは、最初のパターンがそうであるかどうかを尋ね、残りのすべての要素の0
値&&
は0
(再帰を使用して)でなければならないと言います
あなたの例では:
allZero :: [Int] -> Bool
allZero (0:_) = True --Wrong, here you are saying if it start with 0, True, no matter what is next, and that's not correct
allZero (0:s) = 0 : allZero s -- this could be right along side with other patterns
allZero (_:s) = False -- this is wrong by sure, you are saying if a list has at list one element, False
allZero _ = False -- And this one has no sense among the others
あなたにはたくさんのパターンがあり、間違っています。あなたは私の最初の答えを同等のものとして変更することができます:
allZero :: [Int] -> Bool
allZero [] = True
allZero (0:xs) = (allZero xs)
allZero _ = False
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加