1

次のようなカスタム データ型があります。

data Token = Number Int
           | Otherthings

「数字」をある意味で使い、他のことを別の方法で使用できるようにしたい. したがって、次のような case ステートメントを正常に作成できます。

parse x = case x of
    Number y -> y

その後、次のものが正常に取得されます。

let x = Number 7 in parse x

そして、7に評価されます。ただし、「解析」関数を次のように変更しようとすると:

parse [] = []
parse (x:xs) = case x of
    Number y -> y

エラーが発生します:

Couldn't match expected type `[a0]' with actual type `Int'
In the expression: y
In a case alternative: Number y -> y
In the expression: case x of { Number y -> y }

なぜこれがこのように機能しないのですか?この問題に取り組む適切な方法は何ですか? どうもありがとう!

4

4 に答える 4

6

の定義の 2 つの部分の型をparse別々に見てください。

parse :: [a] -> [b] -- both the []'s are lists of some (possibly different) type
parse [] = []

parse :: [Token] -> Int -- y, the function's return value, is an Int.
parse (x:xs) = case x of
    Number y -> y

a ~ TokenInt は何かのリストではあり[b] ~ Intません。(エラー メッセージはa0、私が使用している場所を使用していbます。)

これを回避する方法は、どのタイプを返したいかを考えparse、その定義のすべての部分がそれに一致することを確認することです。あなたが何をしたいparseのか正確にはわからないので、そこに明確な答えを出すことはできません。

于 2013-09-15T18:51:56.267 に答える
1

問題は、空のリストが渡されparseたときに 2 番目の関数が aを返し、空でない が渡されたときにLista を返そうとしていることです。それがコンパイラが不平を言っていることです。IntList

ケース マッチングまたはパターン マッチングを使用している場合は、考えられるすべてのコンストラクターを記述することをお勧めします。たとえばparse、誰かが関数を呼び出したときに関数で何が起こるかを考えてみてください。[Otherthings, Number 3]

おそらくMaybe代わりに使用して、のすべてのコンストラクターに一致させる必要がありData typeます。

parse []     = Nothing
parse (x:xs) = case x of
    Number y    -> Just y
    Otherthings -> Nothing
于 2013-09-15T18:48:21.007 に答える