2

私はそれが 'リスト*'リストであることが望ましいと思います。なぜ私の機能は 'リスト*'リスト - > 'リストですか?

交点は二つのリスト サンプル入力と出力との交点を返すべきである:

  • 交差点([1]、[1])。
    • [1]
  • 交差点([1,2,3]、[1,2])。
    • [1,2]
  • 交差点([2,3]、[1,2]、[2,3]、[1]、[2,3])。
    • は、[[2,3]]

私の機能:

fun intersection (l1, l2) = let 
    fun intersection_acc (acc, [], h::t) = [] 
     | intersection_acc (acc, h::t, []) = [] 
     | intersection_acc (acc, h::t, h2::t2) = if in_list (h, l2) 
      then intersection_acc (h::acc, t, l2)  
     else intersection_acc (acc, t, l2) 
    in intersection_acc ([], l1, l2) 
end 

私は問題であるin_listとは思わないが、それは次のようになります。

fun in_list (x, []) = false 
    | in_list (x, y::r) = if x = y 
    then true 
    else in_list (x, r); 
+3

なぜあなたはこのタグを付けましたmatlabとして?これは明らかにいくつかのMLの変形ではなく、MATLABです。私はSMLを推測していますか? – sepp2k

+0

申し訳ありませんが、私は違いがあったことを認識していませんでした。これはSMLNJだと思います。 – Nate

+3

@Nate:MLはmatlabとは関係ありません。 MLは関数型言語であり、MatLabは必須です。 –

答えて

3

私の推測では、あなたのアキュムレータ機能の基本ケースに手を差し伸べたと思います。

intersection_acc (acc, h::t, []) = [] 

それはおそらくaccに応じて、何かを返す必要があります:

intersection_acc (acc, h::t, []) = acc 

交点は常に空のリスト[]を返しますので、'b listが現れる理由はあります。その空のリストを使用しないので、コンパイラーは保守的で、リストはどのタイプでもよいと言う必要があります。


いずれにしても、機能が根本的に混乱しているようです。フル機能について

fun go(acc, []) = acc 
    | go(acc, x::xs) = 
     if x in list2 then 
      go(x::acc, xs) 
     else 
      go(acc, xs) 

:あなたは、実際にアキュムレータパラメータと再帰関数には、この不可欠コードを翻訳

result = [] 
for each item in list1: 
    if item in list2: 
     add item to result 
return result 

のような何かをしたい

fun intersect(list1, list2) = let 
    fun go(acc, []) = acc 
     | go(acc, x::xs) = 
      if x in list2 then 
       go(x::acc, xs) 
      else 
       go(acc, xs) 
    in go([], list1) 
+0

私のベースケースについてのあなたの点では、あなたは絶対に正しいです。私はそれを私の頭の中で混乱させました。 あなたのgo機能は私より優れています。私はもともとintersection_accを3つのパラメータを含むタプルとの交差点の外側のアキュムレータ関数として設定しましたが、交差点から独立して動作するようになりましたが、不要な(そして変更されていない)2番目のリストをタプルで取り除くとは思わなかった。 ありがとうございました! – Nate

関連する問題