7

私はF#関数を持っています:

let removeEven (listToGoUnder : _ list) =
    let rec listRec list x =
        match list with
        | [] -> []
        | head::tail when (x%2 = 0) -> head :: listRec (tail) (x+1)
        | head::tail -> listRec (tail) (x+1)

     listRec listToGoUnder 0

リスト内の偶数のインデックスにあるすべての要素を削除します。removeEven ['1';'2';'3']私がそうすることになっているように、私がリストにいくらかの入力を与えるならば、それは働き['1';'3']ます。しかし、パラメータとして空のリストを挿入すると、次のエラーが発生します。

stdin(78,1):エラーFS0030:値の制限。値「it」はジェネリック型であると推測されています

val it:'_a list' it'を単純なデータ用語として定義するか、明示的な引数を使用して関数にするか、一般的なものにするつもりがない場合は、型注釈を追加します。

助けて、誰か?

4

1 に答える 1

10

空のリスト([])は非常に特別です。任意のタイプのリストにすることができます。したがって、コンパイラは、の特定のタイプがないことを要求し[]ます。引数に型注釈を追加すると、問題の解決に役立ちます。

let results = removeEven ([]: int list)

@kvbによって提案された、またはより慣用的なタイプの注釈:

let results: int list = removeEven []

これはおそらく問題を超えていますがremoveOdd、インデックスは多くの場合から始まり0、関数は奇数のインデックスを持つすべての要素を削除するため、関数には次のような名前を付ける必要があります。xさらに、インデックスをチェックするためのカウンターを保持するのではなく、リストの最初の2つの要素でパターンマッチングを使用すると、状況がはるかに明確になります。

let rec removeOdd = function
    | [] -> []
    | [x] -> [x]
    | x::_::xs -> x::removeOdd xs
于 2012-02-23T13:06:04.363 に答える