
No.4ベストアンサー
- 回答日時:
>fun sum(nil)=(0,0)
> | sum(x::y::z)=
現在の関数は、リストの長さが偶数の場合しかマッチしないものとなっています。
『sum (x::nil)』のパターンを追加すれば良いと思います。
この回答への補足
度々すいません。パターンの追加は分かりましたが、このパターンの時にどういった処理をさせればいいでしょうか。下記のプログラムでコンパイルするとエラーメッセージが出ました。
- fun sum(nil)=(0,0)
= | sum(x::nil)=(x+L,M)
= |sum(x::y::z)=
= let
= val(L,M)=sum(z)
= in
= (x+L,y+M)
= end;
stdIn:63.20 Error: unbound variable or constructor: M
stdIn:63.18 Error: unbound variable or constructor: L
No.5
- 回答日時:
というか,これの一個前の質問で出てる
リストを順番に二つに分ける関数があれば
それで終わりじゃないの?
情報系の大学の宿題かレポートっぽいので
あえてMLではなくってHaskell風に書くけど
comp::[Int]->([Int],[Int])
と
sumtuple::([Int],[Int])->(Int,Int)
sumtuple (xs,ys) = (sum xs, sum ys)
を関数合成した
(sumtuple . comp)::[Int]->(Int,Int)
が求める関数じゃないの?
No.3
- 回答日時:
if~then~elseでは、thenの処理の値の型とelseの後の処理の値の型が一致しなければなりません。
> if L=nil then nil
> else hd(L)+skip(tl(L))
上記の部分を見るとthenの場合の型はリスト型で、elseの場合の型は『+』演算子が
扱える型(intやreal)になると思います。then部とelse部で型が一致していません。
また、作成する関数の返す値の型は『int * int』なのでどちらとも型が合いません。
奇数番目の値を加算する関数をsum、偶数番目の値を加算する関数をskipとすると
以下のようなると考えればよいと思います。
・sumとskipを相互再起で定義する
・sum、skipとも空のリストの場合は(奇数和初期値,偶数和初期値)として(0,0)を返す
・sumの空リスト以外の場合は、skipを先頭要素を除いたリストで呼び出し、
結果のペアの値の奇数和にリスト先頭要素を加算したペアを作成する
・skipはsumと対象な処理とする
関数の大枠は以下のようになると思います。
fun sum nil = (0,0)
| sum (x::xs) = 奇数和を加算する処理
and skip nil = (0,0)
| skip (x::xs) = 偶数和を加算する処理
この回答への補足
何度も質問してすいません。教えて頂いた説明を読みながらいろいろと手を加えてみました。前回作成したものと違っていますが、コンパイルしたときに下記のようなメッセージが出ます。
- fun sum(nil)=(0,0)
= | sum(x::y::z)=
= let
= val(L,M)=sum(z)
= in
= (x+L,y+M)
= end;
stdIn:58.5-64.4 Warning: match nonexhaustive
nil => ...
x :: y :: z => ...
val sum = fn : int list -> int * int
どこを修正すればメッセージが消えて正常に動作するようになるでしょうか。教えてください。
No.2
- 回答日時:
#1のものです。
#1の回答の関数が分かりにくかったと思うので別の関数を考えました。やはりsumから呼び出す関数です。
仮にこの関数をsum2とすると『fun sum x = sum2 true (0, 0) x』となります。
○引数
関数の型は『bool -> int * int -> int list -> int * int』となる。
引数1:リストの先頭の値が奇数番目かを表すフラグ
引数2:奇数番目の和と偶数番目の和のペア
引数3:処理対象となるリスト
○リストがnilの場合の処理
引数2の値をそのまま返す。
○リストがnil以外の場合の処理
関数を再帰的に呼び出す。関数に渡す値は以下のように求める。
関数に渡す引数1:関数で受け取った引数1のフラグの値を反転(notを使用)した値
関数に渡す引数2:関数で受け取った引数1のフラグの値を条件として処理を分岐
奇数番目の場合⇒「奇数番目の和+リスト先頭の値」と「偶数番目の和」のペア
偶数番目の場合⇒「奇数番目の和」と「偶数番目の和+リスト先頭の値」のペア
関数に渡す引数3:先頭の要素を取り除いたリスト
この回答への補足
度々ありがとうございます。
プログラムを修正してみましたが、コンパイルできません。どこを修正すればいいか教えてください。よろしくお願いします。
修正したプログラム
- fun sum(L)=
= if L=nil then nil
= else hd(L)+skip(tl(L))
= and
= skip(L)=
= if L=nil then nil
= else take(tl(L));
No.1
- 回答日時:
sumから呼び出す関数として以下のようなものを作成すれば良いと思います。
・odd リスト 奇数番目の和 偶数番目の和
リストの先頭の値を奇数番目の和に加えevenを呼び出す。
リストの末尾でペアを返す。
・even リスト 奇数番目の和 偶数番目の和
リストの先頭の値を偶数番目の和に加えoddを呼び出す。
リストの末尾でペアを返す。
このような関数を用意し、"odd リスト 0 0"として呼び出します。
odd関数とeven関数は相互に呼び出しているので、andを使って定義する必要があります。以下のような感じです。
fun odd l a b = ・・・
and even l a b = ・・・
この回答への補足
回答して頂きありがとうございます。
MLの勉強を始めたばかりで説明されている内容は分かるのですが、具体的にプログラミングすることができません。
申し訳ありませんが、具体的にプログラムしたものを教えていただけないでしょうか。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
画像生成AIのプロンプトの作り...
-
vba 正規表現について教えてく...
-
プログラム言語
-
pythonでのローカルファイルか...
-
vba クリップボードクリアにつ...
-
今のプログラミング言語
-
数学、プログラミング、物理、...
-
プログラミング言語のバージョ...
-
⚠️至急です!⚠️ Yahoo!知恵袋の...
-
uwscでPauseキーが押されたら、...
-
数行削除してコピーするbatファ...
-
itエンジニアに就職希望で未経...
-
Python... 環境設定 初心者です...
-
if関数とは?
-
著作権法について
-
プログラミングについて
-
自作scratch アニメの商用利用
-
趣味がプログラミングだと言っ...
-
OS入ってる機器のソフト・アプ...
-
COPYコマンドで、最後に1文字...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
繰り返し1行~28行までを順順に...
-
MATLABにおける行の挿入方法
-
c言語
-
C言語で余りがマイナスになる場合
-
!(否定)演算子について
-
五目並べ
-
Matlabのspdiags関数
-
StandardMLで整数リストの奇数...
-
Z80のフラグレジスタについて
-
matlab、対角行列の作り方
-
H8マイコン C言語でのプロ...
-
Pythonの公式リファレンスガイド
-
最大値を見つけるプログラム。
-
【MATLAB】配列内の数値のキャ...
-
MATLABのデータ抽出についてお...
-
OPENCVを使ったエピポーラ幾何...
-
パイソンのプログラミングにつ...
-
教えて下さい
-
特定のPCだけ動作しないVBAマク...
-
配列数式の解除
おすすめ情報