Fsharpの勉強4日目 - 2022/04/03
型は推論される
https://gyazo.com/7d31a3f4f1833fdfe52c5ca5d38c8fc1
Ionideすごいな、しっかり型推論の結果が出てくる(//以降の部分は自動で出てきている)。 画面に出力する
printf, printfnはまあ分かる。Console.WriteLineはC#の関数?ぽい。 F# では、printf と printfn がより慣用的で好ましいとされています。
とのこと。
こっちにも似たようなことが書いてあった。
Why is printf preferred and considered idiomatic for F#? The reasons are:
- It is statically type checked.
- It is a well-behaved F# function and so supports partial application, etc.
- It supports native F# types.
書式設定
https://gyazo.com/2226b2d32152f6e59feb95acf72ae40b
文字列補完(String Interpolation)しっかりできるんだなー。このあたりはClojureより便利そうって感じがする。 https://gyazo.com/4acf07c42274d8a2aef003b8962d9093
しっかり補完の中でも型チェックされててすごい。試しながら思った「あれ?」って思ったのは、printfnとかは文字列型を取れない?ということ。
https://gyazo.com/ba38214f6bbbcb4af141af0c39b45e71
ちなみにめっちゃ不思議なんだけどprintf "Hello, %s"はOKなんだよなー。まあ、毎回Printf.TextWriterFormatを要求されるのも面倒だからこっちのほうが都合が良いは良い。とりあえず七不思議としておこう。
どうしてもprintf系で文字列を受け取りたいときは、新しい関数をひとつ定義するとよいぽい。
code:fsharp
let print =
printfn "%s"
"Hello, world" |> print
printfnを部分適用してしまえばよいだけなの好き。 演習 - 変数を使用してデータを格納する
エラーのところ面白いなーって思ったけど、普通にIonide使っているとすぐにエラー表示されるから、あり得ないミスではあるなあ。 演算子を適用する
コンソールから入力を読み取る
Console.ReadLine()で標準入力からユーザ入力を受け付けることができる。
データ型間の変換
Int32.Parseをいきなり案内されたから、こいつもClojure的なあれなのかって思ってしまったけど実際にはintという関数が用意されていた。便利。 オペレーター
Fsharpの演算子だとノットイコールは<>らしい。なるほど。 演習 - 電卓プログラムをビルドする
できた。
code:fsharp
let main argv =
printfn "Welcome to the calculator program"
printfn "Type the first number"
let firstNo = Console.ReadLine() |> int
printfn "Type the second number"
let secondNo = Console.ReadLine() |> int
printfn "First %i, Second %i" firstNo secondNo
let sum = firstNo + secondNo
printfn "The sum is %i" sum
0
F# で記述する実行フローの管理
if...elif...elseまじか…elifまじか…。
条件付きロジックを使用して複数の実行パスを作成する
https://gyazo.com/d0a1716ada840a1db8b092ad1c9006c6
↑ここでもしっかり型推論効いてていいぞ、という気持ち。すごいちゃんとしている。
演習 - 条件付きロジックを適用する
ループを使用してステートメントを反復処理する
for...inはともかくfor...toって知らない考え方な気がする。数値でxの値になるまでループする、みたいなのを簡単に書けるシンタックスぽい。極稀に欲しくなるけど、そこまで必要ではない認識。
for...inではパターンにタプルを指定できるらしい。デストラクチャリングみたいなことができるぽい。
code:fsharp
let forInLoop _ =
for (i, j) in list do
printfn "%i, %i" i j
while...doはmutableキーワードを使う前提ぽく見えるけど、実際には外部サービスに接続して真偽値返す関数とか呼び出してもよさそう。ただ、Webアプリ使う文脈ではそうそう使わないだろうな。