０からわかるF#Part1

中 博俊
F# September 2008 CTP Base

わんくま同盟 大阪勉強会 #29

F#ってなに？

• Visual Studio 2010（次のバージョン）でリリースされる
予定• 関数型言語• Ocamlモチーフ
わんくま同盟 大阪勉強会 #29

勝手に言語トレンド• 手続きだけの言語 Cobol, Fortran↓• 構造化言語 Cobol78, C↓• オブジェクト指向言語 C++, Java, C#↓• ダイナミック言語 Python, Ruby↓
• 関数型言語 Ocaml, Haskell, F#
わんくま同盟 大阪勉強会 #29

関数型言語って何？

いろいろ複雑な定義がありますが・・・• 状態を持たないから、副作用を持たない– 変数の書き換えが出来ないという意味• 遅延評価を行う• リスト構造が基本• λ式（ラムダ式）• カリー化 ←カリー博士にちなんで命名

今は気にしなくていいです！
わんくま同盟 大阪勉強会 #29

関数型言語の系譜

Lisp(‘58)

ML(’73)
Caml(‘85)
Haskell(‘87)
Ocaml(‘96)

Scala(‘03)

F#(‘09)
わんくま同盟 大阪勉強会 #29

環境作り• Visual Studio 2008
• Microsoft F#, September 2008 Community
Technology Preview• http://www.microsoft.com/downloads/details.aspx?FamilyID=61ad6924-93ad-48dc8c67-60f7e7803d3c&displaylang=en

たったこれだけわんくま同盟 大阪勉強会 #29

プロジェクトが追加されている

わんくま同盟 大阪勉強会 #29

まとりあえずHello World.

DEMO #1#lightprintf "Hello F# World"
printf "Hello F# World"

わんくま同盟 大阪勉強会 #29

DEMO #2
System.WindowsForms.Dllを参照
System.Windows.Forms.MessageBox.Show "Hello World"

わんくま同盟 大阪勉強会 #29

コンソールモードでやるよ！

• C:¥Users¥vaioz¥Desktop¥FSharp1.9.6.2¥bin¥fsi.exe• これでコンソールモードです。
• 日本語対応してないから本格的には使えない。。。

わんくま同盟 大阪勉強会 #29

１～１０までの二乗を表示するプログラムC#1.0版
ArrayList numbers = new ArrayList();for (int i = 1; i <= 10; i++) {numbers.Add(i); }ArrayList squares = new ArrayList();for (int i = 0; i < numbers.Count; i++) {squares.Add((int)numbers[i] * (int)numbers[i]); }Console.Write("N^2 = {");for (int i = 0; i < squares.Count; i++) {Console.Write(squares[i] + "; "); }Console.Write("}");
Console.ReadKey(true);

わんくま同盟 大阪勉強会 #29

１～１０までの二乗を表示するプログラムC#2.0版
List<int> numbers = new List<int>();for ( int i = 1; i <= 10; i++ ) {numbers.Add(i);}List<int> squares = numbers.ConvertAll(delegate(int x ) { return x*x; });Console.Write("N^2 = {");
squares.ForEach(delegate(int x ){ Console.Write(x + "; "); });Console.Write("}");
Console.ReadKey(true);
わんくま同盟 大阪勉強会 #29

１～１０までの二乗を表示するプログラムC#3.0版

var numbers = Enumerable.Range(1, 10);var squares = (from x in numbers
let square = x*x
select square).ToList();Console.Write("N^2 = {");
squares.ForEach(x => Console.Write(x + ";"));
Console.Write("}");
Console.ReadKey(true);
わんくま同盟 大阪勉強会 #29

１～１０までの二乗を表示するプログラムF#版#lightlet numbers = [1 .. 10]
let square x = x * x
let squares = List.map squarenumbers
printfn "N^2 = %A" squares
System.Console.ReadKey(true)
わんくま同盟 大阪勉強会 #29

絵にしてみた

遅延評価されている

わんくま同盟 大阪勉強会 #29

関数型言語の特徴 リスト構造をおさらい

わんくま同盟 大阪勉強会 #29

無名関数

いちいち関数を
let square x = x * xって書くのは面倒ですよね？
その場合無名関数を使います。
List.map square numbers
をList.map (fun x -> x*x) numbers;と記述することが出来ます。
わんくま同盟 大阪勉強会 #29

カリー化

別に何も難しいことではありません> let add a b = a + b;;
val add : int -> int -> int> add 1 2;;
val it : int = 3> let add1 a = add 1 a;;
val add1 : int -> int> add1 3;;
val it : int = 4
わんくま同盟 大阪勉強会 #29

Tuple> [1,2,3];;val it : (int * int * int) list = [(1, 2, 3)]> [1,"abc"];;val it : (int * string) list = [(1, "abc")]> [[1,'a'];[2,'b']];;
val it : (int * char) list list = [[(1, 'a')]; [(2, 'b')]]

わんくま同盟 大阪勉強会 #29

List• IntのList> [1;2;3];;
val it : int list = [1; 2; 3]> [1..3];;
val it : int list = [1; 2; 3]> [1..2..10];;val it : int list = [1; 3; 5; 7; 9]
List.map fun list
すべてのList要素に関数を適用して、新しいリストを定義する。
List.length list
List.max
List.sum

わんくま同盟 大阪勉強会 #29

Array>[|1;2;3|];;val it : int array = [|1; 2; 3|]>let arr = Array.create 2 “">arr.[0] <- “Hello, ”>arr.[1] <- “F# world”> Array.map (fun x -> printfn "%A" x) arr;;"Hello, ""F# world"
val it : unit [] = [|null; null|]
わんくま同盟 大阪勉強会 #29

for• シンプルループ
for i = 0 to 100 do
printfn "%d" I• 列挙ループ[for i in 0..100 -> i*i]
わんくま同盟 大阪勉強会 #29

パイプ

let pow x = x*x;;
val pow : int -> int> pow 3;;
val it : int = 9> 4 |> pow;;
val it : int = 16
> pow <| 5;;
val it : int = 25
わんくま同盟 大阪勉強会 #29

各種ライブラリ

わんくま同盟 大阪勉強会 #29

.NET使おうよね> 4u.ToString();;val it : string = "4”> open System.Collections.Generic> let lst = List<string>();;
val lst : List<string>> lst.Add("ABC");;val it : unit = ()> let printfn2 x = printfn "%A" x;;> Seq.map (fun x -> printfn "%A" x) lst;;"ABC""DEF""GHI"
val it : seq<unit> = seq [null; null; null]

わんくま同盟 大阪勉強会 #29

.NET使おうよね2#lightopen System.IO
let stream filename =System.IO.File.Open(filename,FileMode.Open)let reader = new StreamReader(stream"C:¥¥temp¥¥a.txt")
let filevalue = reader.ReadToEnd()(fun x -> printfn "%A" x) filevalue
reader.Close()
わんくま同盟 大阪勉強会 #29

まとめ＋次回予告• 今回は難しいのであえてはずした• 型作成• パターンマッチング• 非同期

わんくま同盟 大阪勉強会 #29

••••

F# Developer Center
http://msdn.microsoft.com/en-us/fsharp/default.aspx
Spec
http://research.microsoft.com/enus/um/cambridge/projects/fsharp/manual/spec2.aspx• Library• http://research.microsoft.com/enus/um/cambridge/projects/fsharp/manual/namespaces.ht
ml

わんくま同盟 大阪勉強会 #29

• Blogなど• http://msdn.microsoft.com/ja-jp/magazine/cc164244.aspx• http://blogs.msdn.com/dd_jpn/archive/2008/07/03/86843
53.aspx• Wikipedia• http://ja.wikipedia.org/wiki/F_Sharp

わんくま同盟 大阪勉強会 #29