読者です 読者をやめる 読者になる 読者になる

モノトーンの伝説日記

OBS Studio と Blackmagic Design が大好き。

今日から始める F# “Day 1” 基本、合成

 はじまりましたはじまりましたー! F# “Day 1” ですー。今書きながらブログ記事を始めましたー。最近は割とすんなり頭にプログラミング言語に関しては入ってくるので、いい感じですー。まあ基礎概念ある程度知ってるのと知ってないのでは習熟度合ってのは変わるものかなーって! それじゃあまずトピックから見ていきましょう!

概要

  1. 基本的な宣言
  2. 関数の合成 (compose)
  3. まとめ

1. 基本的な宣言

 いろいろ宣言があるわけですが、それを一通りなぞっていく感じになります。C# と対比させながら書いていこうかなーって思います。というか、開始 10 分ぐらいしか書いてないけど、こりゃいいなーって思ったりw

1.1. 変数宣言

 「変数を束縛する」

let variableName = 2

 終わり! これは代入ではなく束縛と呼びます*1

1.2. 関数宣言

 「関数を束縛する」

let square parameter1 = parameter1 * parameter
let squaredInteger = square 1

 終わり! 二乗演算ですね。関数は変数名の後に引数名をとります。もちろん呼び出しも同じ構図。ね、簡単でしょ?

 ちなみに、

let square = fun parameter1 -> parameter1 * parameter1

も可。lambda exp. です。

1.3. Tuple 宣言

 「Tuple を生成する」

let variable = 2
let square v = v * v
let tupleObject = (variable, square variable)

 Tuple は (p1, p2, …, pn) と書きます。C#er さんなら

var variable = 2;
var square = v => v * v;
var tupleObject = Tuple.Create( square( variable ) );

と書くのではないのでしょうか?

1.4. List 宣言

 「List を生成する」

let list = [1; 2; 3]

1.appendix.

 こんな感じで、基本的な F# の書き方部分は終わり。これからはちょっとずつやっていきますか。

2. 関数の合成 (compose)

 今日のテーマは関数の合成。「がっちゃんこ」します。まず前提として次のコードを挙げておきます。

let square n = n * n        // 数学的に s(n) と書くことにします
let cube n = n * (square n) // c(n)
let double n = 2 * n        // d(n)
let triple n = 3 * n        // t(n)

 じゃあまず s(c(n)) こと (sc)(n) でも作りますか。ちなみにすべての合成関数において可換ではないことには注意しておいてください。

 たとえば、次のように記述できます:

let cubeAndSquare = cube << square

 もちろん、次のような書き方もアリでしょう。

let cubeAndSquare n = cube (square n)

 逆。(dc)(n)

let doubleAndCube = double >> cube

イコール

let dobuleAndCube n = cube (double n)

合成関数風に書くなら後者っぽい。でぃーまるしーをそのまま d >> c って書くだけだし。

3. まとめ

 今日から書き始めたのでいろいろとまだわかっていませんが、書き始めたらすごく面白いなーって思ったので、いろいろ触ってみようと思う限りです。

 ただ、F# で残念なのは VS2010 の VC++ みたいな貧弱なインテリセンスでしょうか。あの当時の記憶がよみがえります。あやつ、マジで残念なんですよね。

 ということで、今日は基本、合成でした。まったね~☆

追記

*1:C# 等では定数概念に近いかもしれません。