スポンサーサイト

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

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

今回のお題は「Computation Expression(3)」です。
 
まずは例をみてください。
type Ex01Builder() =
    member this.Bind (x,rest) = //通常のletと同じ働き
        rest  x
    member this.Return x =
        x
    member this.Delay f =  //これは何?
        f ()
 
let ex00 = new Ex00Builder()
 
let backResult  =
    ex00 { let! a = 2       
           let sum = a + 3  
           return sum }
 
実行すると次のようになります。
 
type Ex01Builder =
  class
    new : unit -> Ex01Builder
    member Bind : x:'c * rest:('c -> 'd) -> 'd
    member Delay : f:(unit -> 'a) -> 'a
    member Return : x:'b -> 'b
  end
val ex01 : Ex01Builder
val backResult : int = 5
 
ex01においてDelayは次のように展開されます。
let backResult =
    ex01.Delay(fun () -> 
        ex01.Bind(2,fun a ->
         以下略
 
 よってこれは、評価のタイミングを制御する場合に使います。
 
 この例の場合、Delayの引数は(fun ()-> ex01.Bind(2,fun ..... です。
 Delayのデフォルトの実装は
     member this.Delay f = 
        f ()
となっているので、すぐ()が渡われることになり、定義すると同時に評価されます。この()を渡すのを自分のタイミングで渡すようにすれば、評価開始を制御できます。
 
よって次のようにして、自分のタイミングで評価を開始できるようにしてみます。
 

let delay func1 = fun () -> func1 () //()が与えられるとfunc1に()が渡される
 
type Ex01Builder() =
    member this.Bind (x,rest) =
        rest  x
    member this.Return x =
        x
    member this.Delay f =
        delay f //delay関数にfを渡す
                //下の例ではfは(fun () -> ex01.Bind(2,fun ....
 
let ex01 = new Ex01Builder()
 
let backResult  =
         ex01 { let! a = 2       
                let sum = a + 3  
                return sum }
 

val delay : (unit -> 'a) -> unit -> 'a
type Ex01Builder =
  class
    new : unit -> Ex01Builder
    member Bind : x:'c * rest:('c -> 'd) -> 'd
    member Delay : f:(unit -> 'a) -> (unit -> 'a)
    member Return : x:'b -> 'b
  end
val ex01 : Ex01Builder
val backResult : (unit -> int)
 
backResultの評価を始めるには()を渡します。
 
> backResult();;
val it : int = 5
 
今回は、「Delayメソッドの定義の仕方で評価のタイミングをコントロールするようにできるよ」という話でした。
スポンサーサイト

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

コメントの投稿

非公開コメント

プロフィール

T GYOUTEN

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

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

この人とブロともになる

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