2017-11-04 15 views
2

2つのリスト('a list'b list)が与えられた関数を作って、('a*'b) listを返します。これは両方のリストのデカルト積です。 私はこれを試しましたが、代わりに'a list'bに等しい'a list listを取得します。 だから、誰かが私が間違っている場所と、OCamlが'a list listの代わりに'a listと尋ねる理由を教えてもらえるかどうか聞いています。デカルト積のタイプエラー

let lprod l1 l2 = 
let rec aux lista la lb = 
    match la,lb with 
     [],_ -> lista 
     |ha::ta,[] -> aux lista ta l2 
     |ha::ta,hb::tb -> aux (ha,hb) la tb 
in aux ([],[]) l1 l2;; 

答えて

1

はここにいくつかの問題があります:

  1. あなたは([], [])の初期アキュムレータ値とauxを呼んでいます。これはタプルのリストではなく、2つのリストからなるタプルです。
  2. 最後にaux(ha, hb)と再帰的に呼び出すブランチでは、タプルのリストではなく1つのタプルです。

おそらく、最初の値を1にして空リストにしてから、cons(::)を使用してタプルを2のアキュムレータに追加することをお勧めします。

編集:

let lprod l1 l2 = 
    let rec aux acc la lb = 
    match la, lb with 
    | [], _ -> acc 
    | ha::ta, [] -> aux acc ta l2 
    | ha::ta, hb::tb -> aux ((ha, hb)::acc) la tb 
    in aux [] l1 l2;; 
+0

はい、私はこれらのアキュムレータをしたいが、どのように私はAUX INリストの代わりにタプルタプルのリストのために呼び出すことができます。ここでは、あなたの実装の修正バージョンですか? –

+0

@JulioVillanueva動作している実装の更新された回答を参照してください – glennsl

+0

これは完璧に近いです。それは私が望むものの逆を返します。 []、_ - > rev acc、私が必要なものを得る、ありがとう –

関連する問題