2016-09-10 3 views
0

辞書はペアのリストです。タスクは辞書をとり、リストの組、すなわちキーと値を返すことです。再帰積算リストを使用するときのタイプエラー

私は辞書を使ってiterating(再帰を使用して)を行い、2つのリストにキーと値を蓄積しようとしましたが、タイプエラーが発生しました。

注:私はではありませんタスクの代替ソリューションを探しています。私は、エラーとそれを修正する方法を理解したい。

は、ここでは、コードされる:

let lists_of_dict dict = 
    let rec separate dict keys values = 
    match dict with 
     [] -> (keys, values) 
    | (k, v)::t -> separate t k::keys v::values 
       (* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ *) 
    in 
    separate dict [] [] 

(下線部は5行目の19から47文字)

ここでは、エラー・メッセージである:

File "lod-problem.ml", line 5, characters 19-47: 
Error: This expression has type 'a list 
     but an expression was expected of type 'b * 'c 

私ができます」なぜOcamlがその型を推論するのか、そして型式が('a list * 'b list)(私が間違っていなければ)であることを理解させる方法を理解する。

答えて

1

separate t k::keys v::valuesは、(separate t k) :: (keys v) :: valuesと解釈され、separate t (k::keys) (v::values)ではありません。

ので、OCamlのは、あなたが::を使用して結果を構築することを見ているので、結果は(::の引数も間違った種類持っているという事実気にしない - そこまで取得することはありません型チェッカー)をリストになるだろうが、期待される結果はタプル(最初のケースが生成したものなので)です。だから、その時点で型チェッカーがエラーになります。

+0

ありがとうございます!私は将来的にもっと慈善団体を使うべきだ」) – angus

関連する問題