先ずは、intのListを用意します。intslistとします。nijyouとevenの関数を用意します。ans1は思った通り。ans2の無名関数は、例題の通り。
結果は出ましたが、true,falseで出ているトコは、数字で出したいのですが…。
ans2を出しているところをevenで置き換えると、結果は思いもよらぬ、方向へ行ってしまいました。何故なんですかね。evenと(fun x -> x % 2 = 0)は意味が同じと思いますが。(even)としても、思った通りにならない。
even intslistを()で括ってみましたが、どうもいかん。関数型プログラミング難しい(笑)例題ばかりやっていると、こういうことには直面しません。
更に不可解は続いて、let ans3 xのトコでも、ぶち当たりました。これは関数を定義したようです。let ans3 intslistとやったら駄目なんですね。どれも理由がわからない。例えばVBだったら関数を呼ぶ場合の引数と、関数での引数は原則、違うので同じでも問題ないと思います。
まだまだ理解が進まない、ゴチャゴチャしてます。(笑と涙)それにしても、猛暑です、暑い。
F#で%はOCamlはmodですが、「数字で出したい」のは恐らくフィルタリングしたいだけ、でしょうから、
let ans2 = List.filter (fun x -> x mod 2 = 0) intslist
と書きたいんじゃないんですか?
あるいはmapをどうしても使いたい、ってぇのなら、トリッキーになるけど
let ans2 = List.concat(List.map (fun x -> if x mod 2 = 0 then [x] else []) intslist)
OCaml/F#は強い静的型付け言語なんで、どうしてもこの辺はメンド臭くなります(条件式が返す値の型が一致してないとならない)。
まぁ、素直にフィルタリングした方がエエんちゃうかな。
(* 別解 *)
let ans2 = List.concat(List.map (fun x -> match (x mod 2) with
0 -> [x]
| _ -> []) intslist)
> ans2を出しているところをevenで置き換えると、結果は思いもよらぬ、方向へ行ってしまいました。何故なんですかね。
evenの定義が間違ってるから、です。
evenはこう書かないとならない。
let even x = x mod 2 = 0
isamさんが書いた例
let even x = fun x -> x mod 2 = 0
だと、x mod 2 = 0が包まれた「ラムダ式そのもの」が返る。
つまり、実行された状態にならないんです。
> 更に不可解は続いて、let ans3 xのトコでも、ぶち当たりました。これは関数を定義したようです。let ans3 intslistとやったら駄目なんですね。
これはね。
let f x =
List.map nijyou (List.filter (fun x -> x mod 2 = 0) x)
と関数として定義しておいて
let ans3 = f intslist
としてからans3 で出力した方がいいです。
> 例えばVBだったら
関数型言語やってる時は「VBだったら・・・」ってなるたけ考えない方がいいです。
じゃないと「悪いスタイル」でいつも考える事になっちゃうから、です。
VBは忘れた方がいいですね。