私はF#を初めて使用しています。いくつかのタイプを設計しようとすると、OOPが設計上の意思決定にどれだけ影響を与えたのか気づきました。私はこの特定の問題を探すのに苦労し、空手になった。インターフェイスからの隠された基礎となる実装でF#タイプを設計
私はC#で何をしようとしているのか、私は用語に詳しいことがあるので説明します。私は、コンテナのようなクラスに最低限必要ないくつかのメソッドを指定するインタフェースを持っているとしましょう。それをとしましょう。次に、私はこのインターフェイスを実装する2つのクラス、ContainerA
とContainerB
を、ユーザーから隠されているさまざまな基本的な実装を持っています。これは非常に一般的なOOPパターンです。
私は同じことを、機能的な世界にとどまるために不変型でしかない、つまり、その機能が互換性のある型を実装するにはどうすればよいのですか?ユーザーが使用するpublic関数は同じです。
type 'a MyType = ...
let func1 mytype = ...
let func2 mytype -> int = ...
MyTypeの定義は不明であり、後で変更することができます。より効率的なバージョンの関数が見つかった場合(コンテナタイプのより良い実装のように)、多くの努力やモジュール全体の再設計を必要としません。 1つの方法は、関数と識別された共用体でパターンマッチングを使用することですが、それはスケーラビリティが高いとは言えません。
F#で同じことをしようとしているのは、クラスとインターフェイスを実装できるからです。 – kemiller2002
はい。 1つの可能性は、デザイン全体をC#からF#にコピーすることですが、基本となる実装は派生クラスの一部でなければなりません。コンテナで動作する関数は、 'container.IsEmpty'を呼び出しますか?そして 'let add ... ='がオブジェクトの状態を変更しないようにクラス/タイプをどのように設計できますか? – NordCoder
F#でOOPを実行しようとしているのか、機能レンズを通して問題を再考しているのかは不明です。あなたはインターフェイスが何をしたいのですが、F#の慣習的なやり方で、あるいはコード内にリテラルインターフェイスを必要としていますか? –