2011-11-13 9 views
1

できますか?私は掘り下げていて、それが可能かどうかについて何も見つけていない。F#での関数呼び出し動作のオーバーロード

私が関数呼び出しの動作をオーバーロードさせたい主な理由は、たくさんのローカル状態を扱う複雑なクロージャを使用するいくつかのコードで終了したことです。

この種のネストされたクロージャは本当に混乱しており、インターフェイスをコードの残りの部分に変更することなく、完全に定義されたスキーマと継承などを持つ本格的なオブジェクトに変換したいと考えています。

答えて

4

F#は、関数のアプリケーションの動作のオーバーロードをサポートしていないため、関数と同じ方法で呼び出せるオブジェクトを記述することはできません。

foo.Invoke(10, "Hello") 

の代わりに:私はあなたのようなものを使用するインターフェイスを変更する必要がありますことを恐れている

foo 10 "Hello" 

オブジェクトの使用は、一般的にも実体がそう、より複雑であることを示唆していますインタフェースを変更することで、それを呼び出す開発者にヒントを与えます(これは複雑な型です)。ドメインに応じて、Invokeのわかりやすい名前を見つける必要があります。

また、カレースタイルの代わりにタプルされたメソッドパラメータを使用するように構文を変更しました - 技術的には、カレンダースタイルもメンバーに使用できますが、一般的には使用されません。

最後に、クロージャがより複雑なデータ構造を表している場合は、データ構造をより明示的にすることができ、データを保持するためにtypeを定義することができます。その後、単純な関数を使うこともできますが、追加の引数としてデータを渡すこともできます(これは単なる実用的なものではありません)。

+0

私が避けたかった主な理由は、それが余分な構文が長さと明快さの面で信じられないほど高価なDSLのためだからです。私はそれをやって、他の方法を見つけるだろうと思う、ありがとう! –

+0

@LiHaoyi構文に関する懸念は、DSLにとってかなり妥当です。 'foo'をオブジェクトの単純な関数ラッパーとして定義できますか?例えば、 'let foo(inst:MyType)num str = inst.Invoke(num、str)'のようなものを書いてください。 –

+0

私が今考えている方法は、演算子を使用したメソッド連鎖でです。 div-emphasis-float(left)* [... some child divs ...] 'を選び、' -'と '*'の演算子は最も目立たないように選んだ。これは、すべてのコードがCSSに似ていても、適度にきれいです( 'div emphasis float(left)[...]') –

関連する問題