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で質問しましょう!
似たような質問が見つかりました
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
- C言語・C++・C# C言語階乗の総和を求める 2 2023/03/04 23:31
- C言語・C++・C# 至急教えてください。プログラミングの問題です。 最初に正の整数nの入力を受け付け、次に分数の分子と分 1 2022/07/19 17:03
- C言語・C++・C# 至急教えてください。プログラミングの問題です。 malloc関数を使ってください!お願いします! 最 1 2022/07/21 09:28
- C言語・C++・C# このプログラミングの問題を教えてほしいです。 キーボードからデータ数nとn個のデータを入力し、平均値 3 2022/12/19 22:51
- C言語・C++・C# 至急お願いします。プログラミングの問題です。 最初に正の整数nの入力を受け付け、次に分数の分子と分母 3 2022/07/19 17:09
- C言語・C++・C# プログラミング実行後の表示される値を答えよ #include<stdio.h> void main( 7 2022/05/20 00:07
- Excel(エクセル) A列が指定数値以上になったらD列の計算式を変更 3 2022/07/11 11:03
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
c言語
-
OPENCVを使ったエピポーラ幾何...
-
MATLABのデータ抽出についてお...
-
MATLABの参考書
-
C言語で行列表現
-
cのプログラミングで虚数を含...
-
C言語で余りがマイナスになる場合
-
H8マイコン C言語でのプロ...
-
特定のPCだけ動作しないVBAマク...
-
Excel・Word リサーチ機能を無...
-
メッセージボックスのOKボタ...
-
UserForm1.Showでエラーになり...
-
Excel マクロ VBA プロシー...
-
配列数式の解除
-
教えて下さい
-
エクセルで特定の列が0表示の場...
-
String""から型'Double'への変...
-
TERA TERMを隠す方法
-
文字列内で括弧を使うには
-
wordを起動した際に特定のペー...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
c言語
-
繰り返し1行~28行までを順順に...
-
H8マイコン C言語でのプロ...
-
!(否定)演算子について
-
C言語で余りがマイナスになる場合
-
MATLABにおける行の挿入方法
-
五目並べ
-
パイソンのプログラミングにつ...
-
if文について教えてください
-
フォートランで行列の計算
-
一般次元の逆行列を求めるプロ...
-
MATLABのデータ抽出についてお...
-
【MATLAB】配列内の数値のキャ...
-
OPENCVを使ったエピポーラ幾何...
-
StandardMLで整数リストの奇数...
-
cのプログラミングで虚数を含...
-
MATLABの参考書
-
C言語で行列表現
-
mathematicaの質問です
-
ダイナミックプログラミング
おすすめ情報