スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

F#入門中級編第4回(Computation Expression(4))

今回のお題は「Computation Expression(4)」です。
 
前回に続いて、Bindメソッドの練習をしてみたいと思います。
次の実行結果は?
 
type Ex02Builder() =
    member this.Bind (x,rest) =
        printfn "引数%dに残りの計算を作用させます" x
        let k = rest  x //#1
        printfn "%dがかえってきました" k
        k + 1
        
    member this.Return x =
        printfn "計算が終わり%dを返します" x
        x
    member this.Delay f =
         f ()
let ex02 = new Ex02Builder()
 
let backResult  =
         ex02 { let! a = 2 //#2
                let sum = a + 3  
                return sum }
                
 
(実行例)
 
引数2に残りの計算を作用させます
計算が終わり5を返します
5がかえってきました
 
type Ex02Builder =
  class
    new : unit -> Ex02Builder
    member Bind : x:int * rest:(int -> int) -> int
    member Delay : f:(unit -> 'a) -> 'a
    member Return : x:int -> int
  end
val ex02 : Ex02Builder
val backResult : int = 6
 
(解説)
これはBindメソッドを使って、計算の順番を制御する例です。
#2の部分で残りのマトリョーシカと2を手にして、残りの計算マトリョーシカに2を押し込んで結果の5をkに束縛します。(#1の部分)そして、1を加えて返します。(よってbackResultの値は6)
マトリョーシカの間に作用を挟むことによって、計算の流れが変化しているわけです。(確かにWorkflow(仕事の流れ)というネーミングがしっくりきます。)
これと、よく似たことをすれば、あるオブジェクトを作成しておいて、使用後廃棄するuseのような使い方もできそうです。(実際にはuse!というのがデフォルトで使えるようになっています。)
また、残りの処理をコールバック関数に渡しておいて....というような処理も考えられます。
とにかく残りの処理全体をかたまり(比ゆ的には指示付きマトリョーシカ)としてとらえることが肝要かと思います。
 
それでは最後に問題です。次の実行結果は?
 
type Ex02Builder() =
    member this.Bind (x,rest) =
        printfn "引数%dに残りの計算を作用させます" x
        let k = rest  x
        printfn "%dがかえってきました" k
        k + 1
        
    member this.Return x =
        printfn "計算が終わり%dを返します" x
        x
    member this.Delay f =
         f ()
 
let ex02 = new Ex02Builder()
 
let backResult  =
         ex02 { let! a = 2 
                let! b = 3 
                let sum = a + b  
                return sum }
                
(実行例)
                
引数2に残りの計算を作用させます
引数3に残りの計算を作用させます
計算が終わり5を返します
5がかえってきました
6がかえってきました
 
type Ex02Builder =
  class
    new : unit -> Ex02Builder
    member Bind : x:int * rest:(int -> int) -> int
    member Delay : f:(unit -> 'a) -> 'a
    member Return : x:int -> int
  end
val ex02 : Ex02Builder
val backResult : int = 7
 
再帰関数に似た流れになっています。
スポンサーサイト

テーマ : プログラミング
ジャンル : コンピュータ

コメントの投稿

非公開コメント

プロフィール

T GYOUTEN

Author:T GYOUTEN
F#と英単語とフリーソフトと読書に興味があります。
ホームページでフリーソフトも公開しています。どぞ御贔屓に。

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
フリーエリア
フリーエリア
blogram投票ボタン
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QRコード
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。