新しいアカウントで始めました。

身の回りの出来事や写真が中心です。

F#イジってみました。Listの復習を兼ねて

2022-07-02 08:51:24 | F#

先ずは、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だったら関数を呼ぶ場合の引数と、関数での引数は原則、違うので同じでも問題ないと思います。

 まだまだ理解が進まない、ゴチャゴチャしてます。(笑と涙)それにしても、猛暑です、暑い。


コメント (2)    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« F#関連寄り道、再々DeepLを使... | トップ | 暫く休んでました。その間に... »
最新の画像もっと見る

2 コメント

コメント日が  古い順  |   新しい順
しばらくの間、VBは忘れた方がいい (cametan_42)
2022-07-02 21:19:23
> 結果は出ましたが、true,falseで出ているトコは、数字で出したいのですが…。

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は忘れた方がいいですね。
返信する
cametan_42さん、コメント有難うございます (isam)
2022-07-03 05:45:24
 適切なアドバイス、いつも有難うございます。もう一度しっかりやってみたいと思います。(感謝)
返信する

F#」カテゴリの最新記事