• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Standerd MLでリストの先頭から2つずつ要素を組にしたリストを作りたい)

Standerd MLでリストの先頭から2つずつ要素を組にしたリストを作る方法

このQ&Aのポイント
  • Standerd MLの問題で整数のリストの先頭から2つずつ要素を組にしたリストを求める関数でcomを作りたい。
  • 'a list -> ('a * 'a) listでcom([1,2,3,4])の場合は([1,2],[3,4])、元の要素数が奇数の場合は0を入れる。
  • 実際に正常に動作するかどうかわからないので、ご指導をお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • aid-u
  • ベストアンサー率75% (22/29)
回答No.3

『com(x::nil)=[(x,0)]』と『com(x::xs::xxs)=[(x,xs)::com(xxs)]』の部分で型が異なっています。 『[(x,xs)::com(xxs)]』の部分が間違っていると思います。 com(x::nil)=[(x,0)] ⇒ この部分を見ると関数の返り値の型は(int * int) list。 com(x::xs::xxs)=[(x,xs)::com(xxs)]の部の型は以下の通り。  com(xxs) ⇒ 型は『com(x::nil)=[(x,0)]』から(int * int) listとする。  (x,xs)::com(xxs) ⇒ 上記のリストの先頭に要素を追加。型は同じ。  [(x,xs)::com(xxs)] ⇒ 上記のリストを要素とするリスト。型は(int * int) list list。 作成したい関数の返す型は(int * int) listでしょうから、『[(x,xs)::com(xxs)]』の部分が間違っていると思います。

yu-ki8877
質問者

お礼

ありがとうございました。 ご指摘頂いた点を修正させて頂きました。 コンパイルも実装もできるようになりました。 いろいろご指導頂きありがとうございました。

すると、全ての回答が全文表示されます。

その他の回答 (2)

  • aid-u
  • ベストアンサー率75% (22/29)
回答No.2

#1です。 『| com(x1::nil)=(x1::0)』の部分ですが、ペアのリストを返すのであれば『[(x1, 0)]』となります。 『| com(x1::x2::xs)=・・・』の処理ですが、以下の2点を行えばよいと思います。  ・xsを引数としてcomを呼び出する  ・com関数からペアのリストが返るので、x1とx2のペアをリストの先頭に追加する

yu-ki8877
質問者

補足

度々回答頂きありがとうございます。 プログラムを書きなおしてみましたがコンパイルできません。 どこを修正すればいいでしょうか。教えてください。 - fun com(nil)=nil = | com(x::nil)=[(x,0)] = | com(x::xs::xxs)=[(x,xs)::com(xxs)];

すると、全ての回答が全文表示されます。
  • aid-u
  • ベストアンサー率75% (22/29)
回答No.1

関数の型が'a list->('a*'a)listであればcom([1,2,3,4])は[(1,2), (3,4)]になると思います。 また、要素数が奇数の場合に0を入れるというのが、com([1,2,3])の結果が[(1,2), (3,0)]となるということだとすると、 関数の型はint list->(int * int) listになります。 このような関数を作成するのであれば、以下の3つのパターンに分けるといいと思います。 ・nilのパターン ・x1::nilのパターン ・x1::x2::xsのパターン

yu-ki8877
質問者

補足

回答して頂きありがとうございます。nilのパターン、x1::nilのパターンについてはプログラムを書けたのですが、x1::x2::xsのパターンのときのプログラムが分かりません。度々すいませんが教えてください。 途中まで考えたプログラム fun com(nil)=nil | com(x1::nil)=(x1::0) | com(x1::x2::xs)=

すると、全ての回答が全文表示されます。

関連するQ&A