let sprite = pipe4 sprite_start blanks (manyTill attribute newline) blanks (fun a b c _ -> Sprite(a,c))
let sprites =
let rec y f x = f (y f) x // The Y Combinator
//let rec sprites_up = many1Indents sprite sprites_up |>> (fun x -> SubSprites x) // Does not work.
let sprites_up = y (fun f -> many1Indents sprite f |>> (fun x -> SubSprites x))
many1Indents sprite sprites_up
これは、私が F# で作成している小さなゲーム ライブラリのコンパイラの例です。より具体的には、上記で sprites_up を再帰的に呼び出す必要があります。そうしないと、インデント パーサーが正しく機能しません。
Y Combinator がなければ、パーサーを適切に実行できず、次のようなものを書く必要があったでしょう。
let sprites_up4 = many1Indents sprite error |>> (fun x -> SubSprites x)
let sprites_up3 = many1Indents sprite sprites_up4 |>> (fun x -> SubSprites x)
let sprites_up2 = many1Indents sprite sprites_up3 |>> (fun x -> SubSprites x)
let sprites_up1 = many1Indents sprite sprites_up2 |>> (fun x -> SubSprites x)
let sprites_up = many1Indents sprite sprites_up1 |>> (fun x -> SubSprites x)
Y Combinator は本当に私を救ってくれました。しかし、それは確かに最初に頭に浮かんだことではありませんでした。