2

タプルリストのインデックスをソートするコードを記述します。ループの 使用を避けるために、マップを使用しようとします。bubblesort()

     bubblesort::(Ord t) => [t]->[t]
     bubblesort[x,y,z,xs]=
                if x<y then x : map bubblesort [y,z,xs]
                       else y : map bubblesort [x,z,xs]  

しかし、それは私に次のようなエラーを与えます:

ERROR行20-リストにエラーを入力します
***式:[y、xs]
***用語:xs
***タイプ:[a]
***一致しません:a
***なぜなら:統一は無限のタイプを与えるだろう

*注意してください私に指示だけを与えてください

-コンパイラはオンラインコンパイラです

4

3 に答える 3

2

これに対する完全な解決策はわかりませんが、バブルソートは期待[t]していbubblesort [x,z,xs]ますが、の関数になり[[t]] -> [[t]]ます。したがって、毎回、タイプは別のタイプにラップされます[]

また、あなたはする必要はありませんmap bubblesort。関数が何をするのかを正確に覚えて、mapこれが意味をなさない理由を確認してください。

于 2012-07-16T17:45:42.757 に答える
1

あなたが抱えている主な問題は、初心者がいつも抱えている問題です。リストを使用しているため、角かっこを使用する必要があると判断しました。本当に必要なのは次のようなものです。

bubblesort (x:y:xs) = 
    if x < y 
       then x : bubblesort (y:xs)
       else y : bubblesort (x:xs)

あなたがのようなものを使うとき

foo [a,b,c] = …

正確に3つの要素を持つリストで明示的にパターンマッチングを行っています。使用する場合

foo (a:b:c:xs) = …

次に、少なくとも3つの要素を持つリストを明示的に照合します。最初の要素は、名前a、2番目のb、3番目のcにバインドされ、リストの残りの部分(長さに関係なく)はxsと呼ばれます。 。

それがそれをクリアするのに役立つことを願っています。これは非常によくある間違いです。

于 2012-07-18T12:18:44.807 に答える
-1

ありがとうaloteetemalmattこれは私自身の問題のための私の奴隷です

  bubbleSort::(Ord t) => [t]->[t]
  bubbleSort[x,y,z,xs]=
                if x<y then x : [y,z,xs]
                       else y : [x,z,xs]
   superBubble::(Ord t) => [[t]]->[[t]]
   superBubble a=map bubbleSort a

私の問題は、mapすべての要素に再帰的に適用される関数で使用することでした。そのため、私の解決策は、bubbleSort()修正されたように、1つの要素で機能させることです。

于 2012-07-16T19:58:15.580 に答える