2012-01-07 8 views
4

私はChris OkasakiのPurely Functional Data Structuresを読んできました。レイジー計算(レイジーモナド)を可能にするモナドの内側にF#でレイジーアルゴリズムを構築する良い方法があるのだろうかと思っています。 ChrisはSMLのサスペンス/フォース構文のカスタム拡張を使用しましたが、私はF#で単純なモナドを使うことができると思っています。 F#での怠け者と力の手動での使用はかなり混乱しているようです。F#で誰かがレイジーなモナドを作ったことはありますか?

Schemeでthisの実装が見つかりましたが、どのように適用できるか分かりません。

私の大雑把な知識と研究から、合理的な制限の範囲内で実現可能であり望ましいと思われる。

私に知らせてください:)

+0

これは関連性があるようです:http://www.paul-abraham.com/MonadsInFSharp.doc –

+0

良いリンク@Robert Harvey –

答えて

7

ポートOkasakiコードに、なぜちょうど例えば、強制的に表現するためにF#lazyキーワードといくつかのヘルパーの構文で行かない:

let (!) (x: Lazy<'T>) : 'T = x.Value 

F#型システムのでできませんモナドを適切に表現するには、遅延計算用の計算式を定義することをお勧めします。私はそれを行うことができると思いますが、それがどのように正確に役立つでしょうか?

type LazyBuilder = 
    | Lazy 

    member this.Return(x: 'T) : Lazy<'T> = 
     Lazy.CreateFromValue(x) 

    member this.Bind(x: Lazy<'T1>, f: 'T1 -> Lazy<'T2>) : Lazy<'T2> = 
     lazy (f x.Value).Value 

let test() = 
    let v = 
     Lazy { 
      let! x = lazy 1 
      let! y = lazy 2 
      return x + y 
     } 
    v.Value 


let (!) (x: Lazy<'T>) : 'T = x.Value 

let test2() = 
    let v = 
     lazy 
      let x = lazy 1 
      let y = lazy 2 
      !x + !y 
    !v 
+0

はい、私は '計算ビルダー'を意味しました:)多分それは有用ではありませんが、私は事実が好きです'return'を使ったアルゴリズムは明示的な強制を必要としないということです。また、let式のようなc式の再帰的な非構造化の自動強制もしたいと思います。 (_、(z:zs))= xysここで、z:zsはレイジーストリームからのものである。しかし、これが実現可能かどうかはわかりません。 –

+0

また、私はF#が「怠惰な評価」モードにあるときの境界が好きだと思います。そして最後に、私はまだFP noobですので、私の好みや欲望は意味をなさないかもしれません:) –

+0

それは価値がありますが、私は(遅延した値を扱うための非常に良いエイリアスを作っているとは思いません。 ref細胞である。しかし、私は全体的なアプローチが良いと思う...代わりに(!!)を使用していますか? – pblasucci

1

私はこのことができますわからないんだけど、あなたは特に何らかの理由にしたい場合は、完全にlazyキーワードを使用して回避できます

type ('a, 'b) lazyT = Lz of 'a * ('a -> 'b) 

let force (Lz (a, e)) = e a 
let pack x = Lz(x, (fun i -> i)) 

type MyLazyBuilder = 
    | Mylazy 
    member this.Bind(x, f) = 
     match x with 
     | Lz(xa, xe) -> 
      Lz(xa, fun x -> force (f (xe x))) 
    member this.Return(x) = pack x 

let sth = 
    Mylazy { 
     let! x = pack 12 
     let! y = pack (x + 1) 
     return y * x 
    } 
let res = force sth 

は(力は一度だけ、それを評価して一部を欠席)。

しかし、それは示唆する価値があると思った。

関連する問題