狠狠撸

狠狠撸Share a Scribd company logo
関数型言語初心者が
F#触ってみた
   @245X
F#とは
? 関数型言語(純粋ではない)

? .NET   Frameworkとの互換性が高い
? Ocamlの機能を多く受け継いでいる
F#を使うメリット
? .NET   Frameworkで使える
? Visual   Studioで開発できる
? 美しいコードが書ける
F# Interactive
 ? F#を実行できるインタプリタ

 ? Visual   Studio 2010以降についてる
 ? Alt+Enterで範囲指定したF#のコードをインタ
  プリタに渡せて便利
変数
? letで宣言できる。

? 基本的に値は変更できない。

? 代入することを「束縛」という。

> let a = 1;;
val a : int = 1

> a <- 2;; // <- は代入の演算子
 a <- 2;;
 ^^^^^^
stdin(7,1): error FS0027: この値は変更可能ではありません
値が変更できないメリット
? 状態に依存しなくなる。

  →バグを抑えることができる。
? いつでも必ず同じ結果が返ってくる。

  →再利用しやすい。
? アルゴリズムが明確になる。

  →リーダブルコード!
純粋な関数
? funをつけることで関数を宣言。
? ラムダ計算においては、関数の引数は常に1つ

     関数定義:fun x -> x + 1 ;;
     関数適用:x 1;;
> let myFun = fun x -> x * x;;

val myFun : x:int -> int

> myFun 3;;
val it : int = 9
2つ以上の引数を渡すには?
? 関数の引数に関数を渡せばよい


> let f = (fun x -> (fun y -> x + y));;

val f : x:int -> y:int -> int

> f 10;;
val it : (int -> int) = <fun:it@2>
> f 10 20;;
val it : int = 30
省略形

let f = (fun x -> (fun y -> (fun z -> x + y + z)));;

let f = fun x y z -> x + y + z;;

let f x y z = x + y + z;;



          どれも同じ関数である。
パターンマッチ
?   お馴染みのFizzBuzz
?   if文で書いてみると以下のようになる。

let FizzBuzz1 num =
      if num % 3 = 0
          && num % 5 = 0 then "FizzBuzz"
      elif num % 3 = 0 then "Fizz"
      elif num % 5 = 0 then "Buzz"
      else string num
これをパターンマッチで書くと…?

let FizzBuzz2 num =
      match num with
      | x when x%3 = 0 && x%5 = 0 -> "FizzBuzz"
      | x when x%3 = 0           -> "Fizz"
      | x when x%5 = 0           -> "Buzz"
      |_                        -> string num

// アンダーバー(_)はワイルドカード

  ? スッキリした形で記述できる。
タプルを使うと更にスッキリする

let FizzBuzz3 num =
   match (num%3, num%5) with
   |(0, 0) -> "FizzBuzz"
   |(0, _) -> "Fizz"
   |(_, 0) -> "Buzz"
   |_      -> string x
パターンマッチの魅力
?   すべてのパターンに到達可能かどうか、またすべての
    パターンを網羅しているかを事前に警告してくれる。
> let FizzBuzz3 x =
      match (x%3, x%5) with
      |(0, 0) -> "FizzBuzz"
      |(0, _) -> "Fizz"
      |(_, 0) -> “Buzz“

FizzBuzz.fs(18,16): warning FS0025: この式のパターン マッチが不
完全です たとえば、値 '(1,1)' はパターンに含まれないケースを示
す可能性があります。

val fb : x:int -> string
関数型言語は
奥が深い???
ところで
F#はWindowsPhone
 開発もサポートして
    いるとか
手順
?   Visual Studio 2010 Professionalをインストール
      →プロジェクトのテンプレートが2010のみ対応のため
?   Visual Studio 2010 Service Pack 1 をインストール
     http://www.microsoft.com/ja-jp/download/details.aspx?id=23691
?   Microsoft Silverlight 4 Tools for Visual Studio 2010 をインストール
     http://www.microsoft.com/ja-jp/download/details.aspx?id=18149
?   Windows Phone SDK 7.1 と SDK7.1.1更新プログラムをインストール
     http://www.microsoft.com/ja-jp/download/details.aspx?id=27570
      http://www.microsoft.com/ja-jp/download/details.aspx?id=29233
?   開発テンプレート F# and C# Win Phone App (Silverlight) をインストール
      http://visualstudiogallery.msdn.microsoft.com/17454c58-c1d9-4640-afe1-7943db13891e/
手順
 ?   ファイル→新規作成→プロジェクト
 ?   Visual F#→WP7→F# and C# Windows Phone Application
     (Silverlight)を選択
 ?   作成して実行してみる
ここで問題発生
?   以下のようなエラーが出る
?   F# runtime for Silverlight version v4.0 is not installed.
?   Please go to http://go.microsoft.com/fwlink/?LinkId=177463
    to download and install matching F# runtime
?   F# for Silverlight Runtime がインストールされていない
?   Microsoft Silverlight 4 Tools for Visual Studio 2010    に含ま
    れてるはずなのに???
仕方ないので

?   Microsoft Silverlight 4 Tools for Visual Studio 2010 の
    実行ファイルからF# for Silverlight Runtime のインス
    トーラを取り出して実行
?   Explzhを使って取り出した
           http://www.ponsoftware.com/
?   FSharpRuntimeSL4.msi を実行
関数型言语初心者の俺が贵#触ってみた
実行できた
構成

?   AppとAppHostに分かれる
?   App.xaml、App.xaml.csは通
    常と同じ
?   MainPage.xamlにビュー
?   AppLogic.fsにロジック
書きやすい?

?   正直まだ分からん
?   複雑なロジックを簡潔に記述できるかもしれない
?   F#のサポートが弱いのがつらい
?   → テンプレートがVS2010のみ対応だし、ストアア
    プリはできなさそう
?   ライブラリ作って呼び出すのは可能なはず
そのうちHaskellも
  勉強します

More Related Content

関数型言语初心者の俺が贵#触ってみた

  • 2. F#とは ? 関数型言語(純粋ではない) ? .NET Frameworkとの互換性が高い ? Ocamlの機能を多く受け継いでいる
  • 3. F#を使うメリット ? .NET Frameworkで使える ? Visual Studioで開発できる ? 美しいコードが書ける
  • 4. F# Interactive ? F#を実行できるインタプリタ ? Visual Studio 2010以降についてる ? Alt+Enterで範囲指定したF#のコードをインタ プリタに渡せて便利
  • 5. 変数 ? letで宣言できる。 ? 基本的に値は変更できない。 ? 代入することを「束縛」という。 > let a = 1;; val a : int = 1 > a <- 2;; // <- は代入の演算子 a <- 2;; ^^^^^^ stdin(7,1): error FS0027: この値は変更可能ではありません
  • 6. 値が変更できないメリット ? 状態に依存しなくなる。 →バグを抑えることができる。 ? いつでも必ず同じ結果が返ってくる。 →再利用しやすい。 ? アルゴリズムが明確になる。 →リーダブルコード!
  • 7. 純粋な関数 ? funをつけることで関数を宣言。 ? ラムダ計算においては、関数の引数は常に1つ 関数定義:fun x -> x + 1 ;; 関数適用:x 1;; > let myFun = fun x -> x * x;; val myFun : x:int -> int > myFun 3;; val it : int = 9
  • 8. 2つ以上の引数を渡すには? ? 関数の引数に関数を渡せばよい > let f = (fun x -> (fun y -> x + y));; val f : x:int -> y:int -> int > f 10;; val it : (int -> int) = <fun:it@2> > f 10 20;; val it : int = 30
  • 9. 省略形 let f = (fun x -> (fun y -> (fun z -> x + y + z)));; let f = fun x y z -> x + y + z;; let f x y z = x + y + z;; どれも同じ関数である。
  • 10. パターンマッチ ? お馴染みのFizzBuzz ? if文で書いてみると以下のようになる。 let FizzBuzz1 num = if num % 3 = 0 && num % 5 = 0 then "FizzBuzz" elif num % 3 = 0 then "Fizz" elif num % 5 = 0 then "Buzz" else string num
  • 11. これをパターンマッチで書くと…? let FizzBuzz2 num = match num with | x when x%3 = 0 && x%5 = 0 -> "FizzBuzz" | x when x%3 = 0 -> "Fizz" | x when x%5 = 0 -> "Buzz" |_ -> string num // アンダーバー(_)はワイルドカード ? スッキリした形で記述できる。
  • 12. タプルを使うと更にスッキリする let FizzBuzz3 num = match (num%3, num%5) with |(0, 0) -> "FizzBuzz" |(0, _) -> "Fizz" |(_, 0) -> "Buzz" |_ -> string x
  • 13. パターンマッチの魅力 ? すべてのパターンに到達可能かどうか、またすべての パターンを網羅しているかを事前に警告してくれる。 > let FizzBuzz3 x = match (x%3, x%5) with |(0, 0) -> "FizzBuzz" |(0, _) -> "Fizz" |(_, 0) -> “Buzz“ FizzBuzz.fs(18,16): warning FS0025: この式のパターン マッチが不 完全です たとえば、値 '(1,1)' はパターンに含まれないケースを示 す可能性があります。 val fb : x:int -> string
  • 17. 手順 ? Visual Studio 2010 Professionalをインストール →プロジェクトのテンプレートが2010のみ対応のため ? Visual Studio 2010 Service Pack 1 をインストール http://www.microsoft.com/ja-jp/download/details.aspx?id=23691 ? Microsoft Silverlight 4 Tools for Visual Studio 2010 をインストール http://www.microsoft.com/ja-jp/download/details.aspx?id=18149 ? Windows Phone SDK 7.1 と SDK7.1.1更新プログラムをインストール http://www.microsoft.com/ja-jp/download/details.aspx?id=27570 http://www.microsoft.com/ja-jp/download/details.aspx?id=29233 ? 開発テンプレート F# and C# Win Phone App (Silverlight) をインストール http://visualstudiogallery.msdn.microsoft.com/17454c58-c1d9-4640-afe1-7943db13891e/
  • 18. 手順 ? ファイル→新規作成→プロジェクト ? Visual F#→WP7→F# and C# Windows Phone Application (Silverlight)を選択 ? 作成して実行してみる
  • 19. ここで問題発生 ? 以下のようなエラーが出る ? F# runtime for Silverlight version v4.0 is not installed. ? Please go to http://go.microsoft.com/fwlink/?LinkId=177463 to download and install matching F# runtime ? F# for Silverlight Runtime がインストールされていない ? Microsoft Silverlight 4 Tools for Visual Studio 2010 に含ま れてるはずなのに???
  • 20. 仕方ないので ? Microsoft Silverlight 4 Tools for Visual Studio 2010 の 実行ファイルからF# for Silverlight Runtime のインス トーラを取り出して実行 ? Explzhを使って取り出した http://www.ponsoftware.com/ ? FSharpRuntimeSL4.msi を実行
  • 23. 構成 ? AppとAppHostに分かれる ? App.xaml、App.xaml.csは通 常と同じ ? MainPage.xamlにビュー ? AppLogic.fsにロジック
  • 24. 書きやすい? ? 正直まだ分からん ? 複雑なロジックを簡潔に記述できるかもしれない ? F#のサポートが弱いのがつらい ? → テンプレートがVS2010のみ対応だし、ストアア プリはできなさそう ? ライブラリ作って呼び出すのは可能なはず