2009-04-03 15 views
3

私はF#ののV 1.9.6.2を使用している、と私は非常に単純な計算式を定義したしましょう実行されませんどのメソッドが計算式で呼び出されているか私は、次の文を実行すると、以下のよう計算式は

this.Let 12 
this.Bind Some 12 
this.Bind Some 11 
this.Bind Some 30

しかし、私の実際の結果は次のとおりです:

maybe { 
    let x = 12 
    let! y = Some 11 
    let! z = Some 30 
    return x + y + z 
} 

を、私は、コンソールには、以下をプリントアウトすることを期待言い換えれば

this.Bind: Some 11 
this.Bind: Some 30

を、 F#はLetのメンバーを実行していないようです。 Letを書き換えて例外をスローすると、コードは例外なく実行されます。また、Letメンバー全員をコメントアウトすると、と表示され、The field, constructor or member 'Let' is not definedというエラーメッセージが表示され、コードが期待通りに実行されます。

(私は反射板を使用してコードを調べてみましたが、通常そうであるようにしました、F#は、読みやすさを超えてマングルされて逆コンパイル。)

spec for computation expressionsが変更されているように見えます。 letバインディングはもはやシンタックスシュガーとして扱われず、Letメンバーはもはや計算ワークフローでは不要ですか?

答えて

4

あなたは自分で答えを持っていました。計算式を変換する方法について説明しF# specから:

{| let binds in cexpr |}C = let binds in {| cexpr |}C) 

ありませんので、あなたが明示的にもう聞かせて定義する必要はありません、それはコンパイラによって翻訳されています。

更新:この変更はthe detailed release notes of the September CTPに記載されています。

+0

は私が実際にそれらのリリース「私の質問を投稿する前に、しかしwasnノートを読んで:)ありがとうございます。おそらくモナドを示す例の100%がLetメンバーを定義しているので、 – Juliet

0

正しい - あなたはもはや聞かせてのバインディングを提供することはできません:(

+0

なぜ悲しい顔ですか?つまり、柔軟性を失うことがわかりますが、そのユースケースはありましたか?一見すると、それは役に立つよりも混乱しているように見えます。 –

+0

私はそれが悪いとは思わない、私は個人的にletの意味を再定義する考えが嫌いです。 – Juliet

+0

最後に私がチェックインしたのは(数ヶ月前)、「非同期」(アプリケーションに固有の)と実行されたすべてのステートメントの早期終了の可能性を持つコンボワークフローを作成することでした。回避するのは難しくない、ちょうどかわいいだろう。私は確かにF#のようにそれを分析していない:)。 – MichaelGG