Q&A
[[1;4];[2;5];[3;6]] (これをlistと名付けます)
これを
map関数によって各要素の積を取って,それをList.fold_rightによって総和を取るということをしたいです.
詰まっているのは,map関数を使い方で,上記のように使うために
map (fun x y -> x*y) list
としたのですが,うまく動いてくれません.記述の仕方が間違っているようなのですが,これはどのように書けば正しく動作しますでしょうか.
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
下記のような質問は推奨されていません。
- 質問になっていない投稿
- スパムや攻撃的な表現を用いた投稿
適切な質問に修正を依頼しましょう。
回答1件
1
ベストアンサー
List.map
関数に渡している匿名関数fun x y -> x * y
ですが、引数を2つ取っています。しかしmap
はlist
の要素を1つずつ取り出して匿名関数に渡しますので、匿名関数は引数を1つだけ取るように定義されていないといけません。
たとえばlist
が[[1; 4]; [2; 5]; [3; 6]]
なら、匿名関数には最初に[1; 4]
という値が1つだけ渡されます。(1
と4
の2つの値ではありません)
つまり匿名関数は引数として[1; 4]
をとり、その引数をmatch
によるパターンマッチングでx
とy
に分解しないといけません。
ocaml
1fun elem -> match elem with 2 | [x; y] -> x * y 3 4(* 上の関数はfunctionを使うと簡潔に書ける *) 5 6function [x; y] -> x * y
これで実行できるようになり、期待どおりの値[4; 10; 18]
が得られます。
ocaml
1# let list = [[1; 4]; [2; 5]; [3; 6]];; 2val list : int list list = [[1; 4]; [2; 5]; [3; 6]] 3 4# List.map (function [x; y] -> x * y) list;; 5Warning 8 [partial-match]: this pattern-matching is not exhaustive. 6Here is an example of a case that is not matched: 7_::_::_::_ 8- : int list = [4; 10; 18]
なお、上の例では匿名関数の定義時にpartial-match
という警告がでていますが、これは[x; y]
というパターンが、長さ2のリストにしかマッチしないからです。この定義では、空のリスト[]
や、長さが1や3のリストが来たときに、それに一致するパターンがないため実行時例外が発生します。
ocaml
1# let list = [[]; [1]; [2; 3]];; 2val list : int list list = [[]; [1]; [2; 3]] 3 4# List.map (function [x; y] -> x * y) list;; 5Warning 8 [partial-match]: this pattern-matching is not exhaustive. 6Here is an example of a case that is not matched: 7_::_::_::_ 8Exception: Match_failure ("//toplevel//", 1, 9).
これを回避するには[1; 4]
のようなリスト(int list
型)ではなく、(1, 4)
のような組((int * int)
型)を使うのがいいでしょう。組なら長さが2と決まっていますので、実行時例外が発生する心配がありません。
ocaml
1# let list = [(1, 4); (2, 5); (3, 6)];; 2val list : (int * int) list = [(1, 4); (2, 5); (3, 6)] 3 4# List.map (function (x, y) -> x * y) list;; 5- : int list = [4; 10; 18]
投稿2021/05/15 15:06
総合スコア2015
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
関連した質問
Q&A
解決済
【Java】Arraysクラスのインスタンス生成ができない理由について
回答2
クリップ0
更新
2023/05/21
Q&A
解決済
Jquery のイベントの開始について
回答1
クリップ0
更新
2023/05/30
Q&A
解決済
logファイルが含まれているか確認する方法
回答2
クリップ0
更新
2023/05/25
Q&A
受付中
ハンバーガーメニューの挙動について(transitionが、もとに戻る時には適応されない)
回答2
クリップ0
更新
2023/06/02
Q&A
解決済
CSS position: absolute が効きません
回答1
クリップ0
更新
2023/05/23
Q&A
解決済
Ansible ansible-playbookコマンドにてtagsで指定したタスクが実行されない
回答1
クリップ0
更新
2023/05/25
Q&A
解決済
flexbox内の表示崩れを解消したいです
回答2
クリップ0
更新
2023/05/30
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。
2021/05/16 01:02