F#のVisualStudio2015の開発環境を用意しよう

関数型プログラミング言語F#は、Visual Studio Community 2015をインストールして、F#のプロジェクトが作れるようにVisual F#ツールを有効化して、拡張機能のVisual F# Power Toolをインストールするだけです。

Visual F#ツールとは

Visual F#ツールはマイクロソフト公式のF#プロジェクト作成機能です。

Visual Studio Community 2015では、何も変更せずにそのままインストールをすると、C++、Python、F#などは新規プロジェクトが作れない状態になっています。そのため以下の方法で設定が可能です。

  1. インストール時にVisual F#ツールを有効化
  2. 必要になったときにVisual Studio の[新しいプロジェクト]ダイアログから有効化
  3. コントロールパネルからVisual Studio Community 2015のインストーラーを起動して、有効化

Visual Studio Community 2015インストール時にVisual F#ツールを設定

Visual Studio Community 2015をインストールと同時にVisual F#をインストールする場合は、インストール時に、カスタムを選択すると以下の表示になるので、[Visual F#]にチェックを入れるとF#の開発ツールがインストールされます。

03
Visual Studio インストール時にF#をインストールする方法

このダイアログは、[コントロール パネル\プログラム\プログラムと機能]からMicrosoft Visual Studio Community 2015 …をクリックすることで表示することができます。「プログラムと機能」ダイアログは、ソフトウェアのアンインストール時によく使いますが、大きなソフトウェアの場合設定変更にも使います。

後から、Visual F#をインストール

すでに、Visual Studio Community 2015をインストールしている場合は、[ファイル]->[新規作成]->[プロジェクト]で、[新しいプロジェクト]ダイアログを表示し、[Visual F# ツールをインストール]を選択して[OK]ボタンでインストールできます。

04
Visual Studio インストール後にF#をインストールする方法

Visual F# Power Tools のインストール

Power ToolsはF# Software Foundationが配布している拡張機能で、11万もダウンロードされているように皆が使っている便利な機能です。この拡張機能で、エディターのハイライト、インデント整形、FSLinterなどが追加されます。F#やHaskellはオブジェクト指向言語とかなり書き方が異なるので、この拡張機能で、保存時に整形するのを強く推奨します。

導入は簡単で画像のように、[ツール]->[拡張機能と更新プログラム]を選択して、ダイアログを表示して、右上の入力欄に”FSharp”など検索文字を入力して、Visual F# Power Toolsをダウンロード・インストールしてください。

05

06

よく使う機能は以下の二つです

  • Ctrl + R, Ctrl + R リネーム
  • Ctrl  + K, Ctrl + D ソースコード整形

とりあえずHelloworld

プロジェクトの新規作成

[ファイル]->[新規作成]->[プロジェクト]から、新しいプロジェクトダイアログを表示して、プロジェクトを新規作成しましょう。今回はFSharpHelloworldにしました。

001

F# Interactiveの表示

F# InteractiveはCtrl + Alt + Fキーで表示できます。メニューの[表示(V)]->[その他のウィンドウ]からも可能です。

[F# Interactive]タブをドラッグ&ドロップしてエディターの左に表示してみました。

002

基本キーを覚えましょう

以下が基本のキーです。これができるとマウスを使わずに、エディターとコンソールを移動できます。

F7キー コードに移動

Ctrl + Alt + Fキー F# Interactiveへ移動、または表示

Ctrl + Alt + Rキー F# Interactiveリセット

Alt + Enterキー カーソル行または選択範囲を、F# Interactiveで実行

Alt + wの後に2キーで、エディターとF# Interactiveの移動

 

Hello world

F# Interactiveで、printfn “hello world”;;と打ち込んでみましょう。F# Interactiveで処理を確定する場合はセミコロンふたつ;;です。これはOcamlからの名残で、OCamlユーザーも使いやすいようにこのままにしているようです。他の言語だと、エンターキーのみやセミコロンで確定するので間違えないようにしましょう。

a01

Alt+Enterキーで、エディター上のコードをF# Interactiveで実行できます。以下の例では、printfn “aaa”を書いて、カーソルを同じ行にして、Alt+Enterキーで、F# Interactiveで実行してます。

a02

ちょっと基本キーでF# Interactiveとエディターを行ったり来たりしたり、両方で実行を繰り返して、基本キーを身に着けてください。

C#やJavaはデバッガーでブレイクポイントを立てますが、F#では小さな関数を作って即試してみる事を繰り返してプログラムを大きくしていきます。このチュートリアルレベルでは、関数型の考え方を学ぶためデバッガーを使ってはいけません。

 

まとめ

今回は、開発環境を用意してHelloworldをやってみました。Visual Studioのインストールだけなので簡単だったはずです。

F#でMapを書いたりしてみました。

[入門]関数プログラミング―質の高いコードをすばやく直感的に書ける!第2章 関数プログラミングのパラダイム―命令プログラミングと何が違うのか 」Gihyo.jpのHaskellの入門記事ですが、Haskellを勉強するのは時間がかかりそうなので、F#で第2章を実装してみました。

 

Haskellでは文字charのリストは文字列なので操作がしやすそうでした。F#だと別のようです。

 

関数型言語F#をやっているときに学んだ数学

関数型プログラミングのF#を学んでいくときに、少しずつラムダ計算と集合・写像・関係などを調べていろんなことが分かってきました。数学の教科書で問題を解こうとすると苦痛で続かないので、mathjaxを書いたり、プログラミングで解いたりして、すこしづつ数学もやっていこうと思います。

集合(set、セット)

集合は、ド・モルガンの法則やベン図で覚えている人も多いはずです。何かしらの集まりを表します。英字で表す場合は、集合を大文字で表し、要素(element、エレメント)は小文字で表します。

数学の記号は、そのままGoogle検索で、「数学 記号 読み方」で見つかります。

集合Aに要素xは属する(belong to)

$$ x \in A $$

集合Bに要素1,2,3,4,5は属する

$$ B = \{1,2,3,4,5\} $$

表記はいろいろあって以下のように条件を書く場合もあります。

$$ C =\{ n | n = 2k, k=1,2,…,10\}$$

$$ C =\{ 2,4,6,8,10,12,14,16,18,20\}$$

上記2つは同じ意味です。

部分集合

集合Aの要素が、集合Aの要素でもある場合、AはBの部分集合である。

記号で書くと、

$$ A \subseteq B $$

べき集合(Power Set)

集合Aのすべての部分集合からなる集合をAのべき集合といい、以下のような表し方をします。

$$ 2^A $$

A={a,b}なら、P(A) = { Φ, {a},{b},{a,b}}

直積集合(direct product)

$$ A \times B = \{ (a,b) \mid a \subseteq A \land b \subseteq B \}$$

Wikipediaの図が分かりやすい。直積は、direct product、デカルト積(Cartesian product)ともいう。

集合X = 1,2,3で集合Y = 5,6,7だったら、総当たりで以下のようになります。

X x Y = {(1,5),(1,6),(1,7), (2,5),(2,6),(2,7), (3,5),(3,6),(3,7)}

プログラミングだと2重のforループです。また(x,y)のような書き方を対(つい)、タプル、ペアと呼びます。

内包表記(comprehension)

数学の集合では、条件を書く方法がいろいろあります。プログラミング言語のリスト内包表記はここからきているのだと思います。

$$ A = \{x^2 | x \in  \{1..5\}\} $$

$$ A = \{1,4,9,16,25\} $$

F#ではリスト内包表記があります。

 

関係(relation)

高知工科大学の高校生向けの資料(関係を図で表現する道具(坂本 明雄))がすごくわかりやすいです。

2つの集合A、Bの直積集合A×Bの部分集合Rを関係と呼びます。それは、XY座標でも表示できるし、関係グラフ、有向グラフ、関係行列でも表示できます。

https://ja.wikipedia.org/wiki/直積集合

 

プログラミングで理解する反射律・対称律・推移律・反対称律

集合Aの直積集合A^2の部分集合をA上の関係と呼びます。A={1,2,3}だった時AxA={(1,1),(1,2),(1,3), (2,1),(2,2),(2,3), (3,1),(3,2),(3,3)}が直積集合となります。部分集合R={(1,2),(2,1),(3,3)}としたら、このRをA上の関係と呼びます。

写像(map)

先ほどのおさらい、2つの集合A、Bの集合AxBの部分集合Rを関係と呼びます。さらに、

集合Aの各要素に、それぞれBの要素がただ1つ対応している関係をAからBへの写像(map)といい微分積分の分野では、関数と呼びます。

 

非交和

https://ja.wikipedia.org/wiki/非交和

 

二項関係

論理(Logic)

論理(Logic)も同様ですが、数学のタイトルや項目を見るとちゃんと、集合と集合演算として分かれています。論理でも論理と論理演算となっていて、あらためて昔はテストの勉強のために問題を解いていただけなんだと思いました。

論理演算の英語はLogic Operation

命題関数

 

代数系

大人になってからの再学習 の★群・環・体 – 大人になってからの再学習 が分かりやすいです。数学の教科書を開く前にこの表をみてみるのが良いですね。

http://hooktail.sub.jp/algebra/FundamentalTheorem/

http://sun.ac.jp/prof/hnagano/houkoku/h26informationmath-13.html#1101

http://qiita.com/taketo1024/contributions

資料

Mathjaxの記号の書き方

http://www.mathsisfun.com/sets/index.html

 

 

F#ではじめての型プロバイダー(TypeProvider)

F#はバージョン3.0から型プロバイダーが用意されました。これはデータベーススキーマからレコード型を作ったり、CSVやXMLからも型を動的に作れる機能です。O/Rマッピングの場合はリレーショナルデータベースが対象ですが、”型を作るプロバイダー”を用意して、Twitter用プロバイダー、CSVプロバイダーのようにやっていこうという感じです。

型プロバイダーとは?

オブジェクト指向言語でいうところのO/Rマッピングが似たような感じです。O/Rマッピングのツールは、リレーショナル・データベースのスキーマから、クラスを生成したりまた逆ができます。

型プロバイダーは、リレーショナル・データベースに限らず、XMLやJSONやCSVなどの型プロバイダーがあります。Twitter用の型プロバイダーをみると、他の言語でいうサードーパーティーライブラリーと変わりないことも確認できます。

今回は、はじめての型プロバイダーということで、FSharp.DataのCsvProviderを使ってみます。

新規プロジェクトの作成

[ファイル]->[新規作成]->[プロジェクト]から、新しいプロジェクトを作成します。今回は、右下のソリューションのディレクトリを作成にチェックを入れて作成します。ライブラリーの場所を自動指定してくれないため、手作業で指定します。そのため慣れるまでは、同じようにソリューションのディレクトリーを作成したほうが良いです。

001

FSharp.Dataライブラリーのインストール

[ツール]->[NuGetパッケージマネージャー]->[ソリューションのNuGetパッケージの管理]を選択。

002

[NuGet – ソリューション]タブで、検索条件に”FSharp.Data”などを書いて、FSharp.Dataを見つけて、インストールです。

005

正しくインストールされると、プロジェクトの参照設定に、FSharp.Dataがあるのが確認できます。

003

また、エクスプローラーからは、ソリューションのディレクトリーにpackagesディレクトリーができていて、そこにDLLファイルが配置されます。

004

Program.fsで実行する

FSharp.Dataをopenして使えるようにして、CsvFile.Loadでインターネット上のCSVファイルを取得するだけのソースコードです。CSVファイルの1行目にカラム名があれば、row.GetColumn “カラム名”で、対象のカラムが取得できます。

これは単純にデータを取得して結果を少し加工して表示するだけなので特に難しいことはありません。

Visual Studio Community 2015の場合は、開始ボタンで問題なく実行できます。

F# Interactiveで実行する方法

ここがすごく失敗する部分です。FSharp.Dataの公式ドキュメントではVisual Studio 2015で実行する例ではないため公式ドキュメントの通りにやろうとするとライブラリーのパスが通ってなくて失敗します。

もう一度ディレクトリー構造のおさらいですが、ソリューション用のFSharpHelloTypeProviderディレクトリーがあり、その中にプロジェクト用のFSharpHelloTypeProviderディレクトリーがあり、そこにProgram.fsがあります。また、FSharp.Data.dllはソリューション用ディレクトリー内のpackagesにあります。

006

 

F#Interactiveで実行するには、C言語のように、#ディレクティブを作成し、#Iで探すディレクトリーを指定し、#rでロードするdllを記述します。今FSharpHelloTypeProviderプロジェクトにProgram.fsファイルがあります。その親が、ソリューション用のディレクトリーで、そこにpackagesディレクトリーがあるので、以下のように指定します。

 

これで、Program.fsで、範囲指定して、Alt+Enterで実行できます。

fsxファイルをF# Interactiveで実行する方法

これもやり方は一緒ですが、はじめての場合は、プロジェクトなしの新規ファイルではなく、今回のようにプロジェクトを1つ用意して、そこにfsxファイルを作ってしまったほうが簡単なようです。

007

ソースコードはエントリーポイントがないだけで全く同じです。こちらもAlt+EnterでF# Interactiveから実行できるようになります。

 

FSharp.Dataの使い方と、F#のディレクティブは全く別物なので、問題は切り分けてFSharp.Dataでいろいろ試してみて、あとからF# Compiler Directivesを学べばよいです。

現状の問題点

FSharp.Dataの問題点ではないですが、私のVisual Studio Community 2015の環境だと、Program.fsをCtrl+K,Ctrl+Dで整形すると、#I,#rのディレクティブが消えてしまいます。

fsxスクリプトファイルは、[ファイル]->[新規作成]->[ファイル]から、単体でスクリプトファイルを作るのではなく、今回のようにプロジェクトに追加すると、整形コマンドが動作して開発しやすいです。

またスクリプトファイル内に書かずにコマンドライン引数に設定する方法などもあるようです。

http://stackoverflow.com/questions/2982841/f-interactive-reference-a-project-in-currently-open-solution

 

CsvProviderを使う!

FSharp.Data日本語サイトの最初に書かれている以下データをdata\MSFT.csvファイルとして保存します。

008

MSFT.csv

csvにヘッダーがあれば、CsvProviderは、このヘッダー情報からF#の型を作るためDateやOpenという名前でカラム情報を取得できます。

前回と違うのは、以下のコードでStocks型を作成しているところです。

また、forループで各行をrowとして取得した後、row.Highやrow.Openのように名前で値を取得できています。

まとめ

今回は、Visual Studio Community 2015で、CsvProvider型プロバイダーを使ってみました。リレーショナルデータベースだけでなく、JSONやXMLも同じ作業手順でやっていけるので便利そうです。

 

関数型言語F#のラムダ計算で引き算ができません

はじめに

関数型プログラミング言語は、ラムダ計算という仕組みが元になっているというのをよく入門記事で見かけます。実際にラムダ計算を調べてみると基本ルールはとても小さく、関数だけで数字や演算子を作り上げる面白い仕組みというのが分かりました。

また、F#やHaskellは文法上、括弧が少なくカリー化で引数がひとつずつ繋がっているのでラムダ計算の表記をF#にとても落とし込みやすかったです。たぶんHaskellも同じようにやりやすいのだと思います。私のスキルはFizzBuzzを書くぐらいのレベルですが、興味のある事をしないと命令型言語に戻ってしまうのでF#でラムダ計算をやるだけやってみました。

問題点

以下ソースコードは、https://en.wikipedia.org/wiki/Church_encoding を参考に書きました。コードの次に書いてあるエラーのように、型が一致しませんの表記がすごいことになっていて、とても解決できるものではありません。

ソースコード

 

 

型が一致しませんエラーが解決できません。

66行目、let test021() = minus n2 n2のコメントアウトを外すと型が一致しません。というエラーが発生します。

 

いろいろ調べてみる

“F# lambda calculus”などで検索すると、”A Lambda Calculus AST”などが見つかるので、こういうソースを追いかけてみるもの良いのかもしれません。pureというプログラミング言語だと近い表記で実装できそう。

Haskellでもエラーがでる?

  • http://d.hatena.ne.jp/mokehehe/20080202/lambda
  • http://d.hatena.ne.jp/katona/20100615/p1
  • http://d.hatena.ne.jp/katona/20100427/p1
  • https://uid0130.blogspot.jp/2013/05/x.html