ブログを書いていると思いつくんです。(笑)無名関数を使う方法がないですね。
同じようなのがありますので、それを使えば良いのかなあ?myBMI3をa, bとしないで数字を書けば良いのかも。
追加)一番最後の例(No6)、少し勘違いしてました。
最後のものが難しかった。どうやってa bに数値を渡すか?Lambdaの書き方は、前にあったので、OKでした。F#はインデントが効いてますので、VBのように整形してくれません。残念。
ブログを書いていると思いつくんです。(笑)無名関数を使う方法がないですね。
同じようなのがありますので、それを使えば良いのかなあ?myBMI3をa, bとしないで数字を書けば良いのかも。
追加)一番最後の例(No6)、少し勘違いしてました。
最後のものが難しかった。どうやってa bに数値を渡すか?Lambdaの書き方は、前にあったので、OKでした。F#はインデントが効いてますので、VBのように整形してくれません。残念。
Listは、[1; 2; 3;]や["one"; "two"; "three"]のように作って、要素のタイプは、混ぜることが出来ない。
tupleは(1, "two", 3.3)のように作って、要素のタイプは、混ざっても良い。零のBMIは単位の関係でだと思うが、703という定数が入ってきている。体重Kgを身長Mで2回割る、で良いはず。
cametan_42さんがコメントしてくれた書き込みはこちら。F#と似ているOcamlのコードですが、ものすごく参考になります。F#でも動いたのですが、若干の違いは有るようです。
末尾再帰は、説明を読んでも、ピンと来ないです。(涙&&哀)
試行錯誤の結果です。
例えば、この結果を配列に名前をつけて保存するにはどうするんでしょうか?初めて、F#で作ってみました。forを中断するbreakは有るんでしょうか?
F#も完全関数型ではないようですが、それに近い。最大公約数を求めるC言語の参考書から、アルゴリズムを頂いたのですが、C言語は変数を扱いますが、ほぼそれだけ、F#ではletで普通にやると、拘束される。変更できない。どうしてもということだとmutableと入れます。図のように。再帰の例のようにやろうとしたんですが、C言語のif文の解釈が違っていたようで、無限ループしてしまいましたので、除算の余りの方に変えました。
マイクロソフトのサイトから抜粋1
要素のコレクションまたはシーケンスの処理は、通常、F# の再帰を使用して行われます。 F# では、ループや命令型プログラミングもサポートされていますが、正確性を保証するのが簡単であるため、再帰が推奨されます。
マイクロソフトのサイトから抜粋2
F# では、末尾呼び出し最適化も完全にサポートされています。これは、再帰呼び出しを最適化して、ループ コンストラクトと同じ速度でできるようにするための方法です。
抜粋1、抜粋2共に、何を言ってるのか?(苦)理解できたのは、6の階乗だけ。
マイクロソフトのF#ツアーも進んで来て、自分の力を越えようとしてますので、このまま進むか?あるいは興味のあることに絞るか?考えながらになります。(苦渋の決断)
以下はマイクロソフトのサイトからの抜粋
シーケンスは、すべてが同じ型の論理的な一連の要素です。 これらは、リストや配列より一般的な型であり、任意の論理的な一連の要素を "表示" することができます。 また、それらは遅延にできる点でも優れています。これは、必要な場合にのみ要素を計算できることを意味します。
以下は上を多少イジりました。
多少yieldはPythonでも、触れていたので、イメージは持っていました。若干違ったのが18、19行目が纏めて行われるように思ってましたがそうではありませんでした。17行目のyieldで、一旦抜けて、18行と19行を実行しますが、ここで終わりでなくて、もとに戻る感じですかね?データによる再帰そんな感じですね。
追記)同じyieldでも、Arrayに適応すると、纏まった処理になります。Sequenceだと遅延評価というんですかね?一件づつの処理になります。
以下はマイクロソフトのサイトから抜粋です。
配列は、同じ型の要素の固定サイズの "変更可能" なコレクションです。 要素の高速なランダム アクセスがサポートされており、連続したメモリ ブロックであるため、F# のリストより高速です。
以下は少しだけ、変えてみました。
F#では、(他の言語との比較ではありません)多分tupleとListは変更不可だったと思います。イミュータブルというと思います。Arrayは例にある通り変更可能ですが、関数型プログラミングでは嫌われるようです。自分は、変更自由な言語から入ってますので、Arrayに親しみを感じてしまうのは、遅れてる!、なんでしょうね。
追記)
for文で良いのかな?doが付くことに注意です。それからタグですが#F#としたつもりですが、#Fに変わってます。自由ではないようです。
どの言語でも、躓くyield出てきました。シーケンスの説明で出てくると言うのでここはスルーします。Listは"[]"で括って、区切りは";"を使うようです。List.map、List.filter、List.sumByなど機能があるようです。
以下はネタサイトからの抜粋
リストは、同じ型の要素の順序付けられた、変更できないコレクションです。 これらはシングル リンク リストです。つまり、それらは列挙のためのものであり、サイズが大きい場合のランダム アクセスや連結には適していません。 これは、通常、リストを表すためにシングルリンク リストを使用しない他の一般的な言語のリストとは対照的です。
ネタサイトから抜き出し。
Pipelinesは引数を渡していく、感じですね。14行目のfunction1には、引数100を渡してますが、15行目のfunction1には、左からくる。感じですかね。
丁寧な説明は、ネタサイトにあります。もともとはコマンドラインから行っていますが、VSCodeではF#が動きません。動かせませんので、Visual Studio 2022のF#でやってみました。調べる単語は(banana、apple)は、コマンドラインの引数ですが、配列で与えてます。
今までmodule foo =と[]の関係が、思い違いしているようです。ここでは=が有って、EntryPointもあります。
上のコメントを取って、最初の方法に焦点を合わせました。
感じとしては、numbersから奇数を取り出して、1加えて、それの2乗します。答えは配列、リストですか?isOddはList.filterなんですね。List.mapだと方が合わないエラーが出ます。Pipelineは次回になりました。