依存するメソッドタイプの魅力的なユースケースは何ですか?

missingfaktor

以前は実験的な機能であった依存メソッドタイプが、トランクデフォルトで有効になりました。これにより、Scalaコミュニティに興奮が生じたようです。

一見すると、これが何に役立つかはすぐにはわかりません。Heiko Seebergerは、依存メソッドタイプの簡単な例をここに投稿しました。コメントに示されているように、メソッドのタイプパラメータを使用して簡単に再現できます。したがって、それはあまり説得力のある例ではありませんでした。(明らかな何かが欠けている可能性があります。その場合は修正してください。)

代替メソッドよりも明らかに有利な、依存メソッドタイプのユースケースの実用的で有用な例は何ですか?

以前は不可能/簡単であった、それらを使ってどのような興味深いことができますか?

彼らは既存の型システム機能に対して何を購入しますか?

また、依存メソッドタイプは、Haskell、OCamlなどの他の高度な型付き言語の型システムに見られる機能に類似しているか、そこからインスピレーションを得ていますか?

マイルズサビン

多かれ少なかれ、メンバー(つまりネストされた)タイプを使用すると、依存するメソッドタイプが必要になる可能性があります。特に、依存するメソッドタイプがない場合、従来のケーキパターンはアンチパターンに近いと私は主張します。

だから問題は何ですか?Scalaのネストされた型は、それらを囲むインスタンスに依存しています。その結果、依存するメソッドタイプがない場合、そのインスタンスの外部でそれらを使用しようとすると、イライラするほど困難になる可能性があります。これにより、最初はエレガントで魅力的に見えるデザインが、悪夢のように硬く、リファクタリングが難しい怪物に変わる可能性があります。

AdvancedScalaトレーニングコース行う演習でそれを説明します

trait ResourceManager {
  type Resource <: BasicResource
  trait BasicResource {
    def hash : String
    def duplicates(r : Resource) : Boolean
  }
  def create : Resource

  // Test methods: exercise is to move them outside ResourceManager
  def testHash(r : Resource) = assert(r.hash == "9e47088d")  
  def testDuplicates(r : Resource) = assert(r.duplicates(r))
}

trait FileManager extends ResourceManager {
  type Resource <: File
  trait File extends BasicResource {
    def local : Boolean
  }
  override def create : Resource
}

class NetworkFileManager extends FileManager {
  type Resource = RemoteFile
  class RemoteFile extends File {
    def local = false
    def hash = "9e47088d"
    def duplicates(r : Resource) = (local == r.local) && (hash == r.hash)
  }
  override def create : Resource = new RemoteFile
}

これは、古典的なケーキのパターンの例です:私たちは徐々に階層構造を通じて洗練されている抽象化の家族を持っている(ResourceManager/Resourceで洗練されているFileManager/Fileで洗練された順番にですNetworkFileManager/ RemoteFile)。これはおもちゃの例ですが、パターンは本物です。Scalaコンパイラ全体で使用され、ScalaEclipseプラグインで広く使用されていました。

使用中の抽象化の例を次に示します。

val nfm = new NetworkFileManager
val rf : nfm.Resource = nfm.create
nfm.testHash(rf)
nfm.testDuplicates(rf)

注コンパイラがいることを保証することにパス依存手段ものtestHashtestDuplicates上のメソッドNetworkFileManager缶は唯一の引数それに対応、すなわちと呼ばれます。それはそれ自身のものRemoteFilesであり、他には何もありません。

これは間違いなく望ましいプロパティですが、このテストコードを別のソースファイルに移動したいとしますか?依存するメソッドタイプを使用すると、ResourceManager階層外でこれらのメソッドを再定義するのは簡単です

def testHash4(rm : ResourceManager)(r : rm.Resource) = 
  assert(r.hash == "9e47088d")

def testDuplicates4(rm : ResourceManager)(r : rm.Resource) = 
  assert(r.duplicates(r))

ここでの依存メソッドタイプの使用に注意してください。2番目の引数(rm.Resource)のタイプは、最初の引数(rm)の値によって異なります。

依存するメソッドタイプなしでこれを行うことは可能ですが、それは非常に厄介であり、メカニズムは非常に直感的ではありません。私はこのコースを2年近く教えてきましたが、その間、誰もプロンプトなしで実用的な解決策を思いつきませんでした。

自分で試してみてください...

// Reimplement the testHash and testDuplicates methods outside
// the ResourceManager hierarchy without using dependent method types
def testHash        // TODO ... 
def testDuplicates  // TODO ...

testHash(rf)
testDuplicates(rf)

しばらく苦労した後、私(またはDavid MacIverだったかもしれませんが、どちらがこの用語を作り出したのか思い出せません)がこれをBakery ofDoomと呼んでいる理由がわかるでしょう。

編集:コンセンサスは、Bakery ofDoomがDavidMacIverの造語であったということです...

ボーナスとして:Scalaの一般的な依存型の形式(およびその一部としての依存メソッド型)は、プログラミング言語Betaに触発されました...それらはBetaの一貫したネストセマンティクスから自然に発生します。この形式の依存型を持つ、かすかに主流のプログラミング言語でさえ、他に知りません。Coq、Cayenne、Epigram、Agdaなどの言語には、いくつかの点でより一般的な依存型の異なる形式がありますが、Scalaとは異なり、サブ型がない型システムの一部であるという点で大きく異なります。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

フラッターでlerp()メソッドを使用する方法とユースケースは何ですか?

分類Dev

メソッドの静的インポートの良いユースケースは何ですか?

分類Dev

プロメテウスのサマリーメトリックタイプを本当に必要/一意にするユースケースは何ですか?

分類Dev

Codeceptionでユニットテストスイートのカスタムヘルパーメソッドを追加する正しい方法は何ですか?

分類Dev

メタクラスの(具体的な)ユースケースは何ですか?

分類Dev

Scalaがメソッド名のスペースをエスケープするのはなぜですか?

分類Dev

リファクタリング:メソッド(self、other)などのインスタンス引数でメソッドをオーバーロードするタイプセーフな方法は何ですか?

分類Dev

Goのメソッドのスコープは何ですか?

分類Dev

戻り型がそれが属するのと同じ名前であるインターフェース型メソッドのユースケースシナリオは何ですか?

分類Dev

Javaコンパイラがパッケージプライベートスーパータイプで定義されたパブリックメソッドに可視性ブリッジメソッドを追加するのはなぜですか?

分類Dev

Java:例外をスローする可能性のあるインターフェースメソッドを宣言する適切な方法は何ですか?

分類Dev

インターセプタークラスがスケジュールメソッドで機能しないのはなぜですか?

分類Dev

メタパッケージに依存するネットスタンダードライブラリのアプリケーションへの影響は何ですか?

分類Dev

Javaメソッドのオーバーライドでスーパータイプを許可しない理由は何ですか?

分類Dev

メソッドの制約はスコープ内のインスタンスに依存しますか?

分類Dev

Typescriptでクラスメソッドのユーザータイプガードを機能させるにはどうすればよいですか?

分類Dev

メインスレッドはスレッドプール/タスクベースのアプリケーションで何をしますか?

分類Dev

FirebaseUserのreload()関数がフラッターになっているユースケースは何ですか?

分類Dev

Factoryメソッドパターンは、テンプレートメソッドパターンの特殊なケースですか?

分類Dev

Kotlin MPPプラグインを使用する場合、単純な依存関係とソースセットの依存関係の違いは何ですか?

分類Dev

「のインスタンス」「のタイプ」のユースケースは何ですか?

分類Dev

http.createServerメソッドに追加されたオプション引数のユースケースは何ですか

分類Dev

MVCで「Create」コントローラーメソッドをユニットテストするのに十分なテストは何ですか?

分類Dev

スプライスメソッドの2番目のパラメータは何をしますか?

分類Dev

Pythonの適切なエンドレスソケットサーバーループとは何ですか

分類Dev

メソッドが終了する前に、インスタンスメソッドで弱いメンバーをnullにできるのはなぜですか?

分類Dev

AWSパラメータストアの値を暗号化するユースケースは何ですか?

分類Dev

インターフェイスとクラスの違いは何ですか?また、クラスにメソッドを直接実装できるのに、なぜインターフェイスを使用する必要があるのですか?

分類Dev

クロスプラットフォームのオープンソースUIに依存しないC#クラスライブラリに選択するVisual Studio 2017プロジェクトタイプとその理由は何ですか?

Related 関連記事

  1. 1

    フラッターでlerp()メソッドを使用する方法とユースケースは何ですか?

  2. 2

    メソッドの静的インポートの良いユースケースは何ですか?

  3. 3

    プロメテウスのサマリーメトリックタイプを本当に必要/一意にするユースケースは何ですか?

  4. 4

    Codeceptionでユニットテストスイートのカスタムヘルパーメソッドを追加する正しい方法は何ですか?

  5. 5

    メタクラスの(具体的な)ユースケースは何ですか?

  6. 6

    Scalaがメソッド名のスペースをエスケープするのはなぜですか?

  7. 7

    リファクタリング:メソッド(self、other)などのインスタンス引数でメソッドをオーバーロードするタイプセーフな方法は何ですか?

  8. 8

    Goのメソッドのスコープは何ですか?

  9. 9

    戻り型がそれが属するのと同じ名前であるインターフェース型メソッドのユースケースシナリオは何ですか?

  10. 10

    Javaコンパイラがパッケージプライベートスーパータイプで定義されたパブリックメソッドに可視性ブリッジメソッドを追加するのはなぜですか?

  11. 11

    Java:例外をスローする可能性のあるインターフェースメソッドを宣言する適切な方法は何ですか?

  12. 12

    インターセプタークラスがスケジュールメソッドで機能しないのはなぜですか?

  13. 13

    メタパッケージに依存するネットスタンダードライブラリのアプリケーションへの影響は何ですか?

  14. 14

    Javaメソッドのオーバーライドでスーパータイプを許可しない理由は何ですか?

  15. 15

    メソッドの制約はスコープ内のインスタンスに依存しますか?

  16. 16

    Typescriptでクラスメソッドのユーザータイプガードを機能させるにはどうすればよいですか?

  17. 17

    メインスレッドはスレッドプール/タスクベースのアプリケーションで何をしますか?

  18. 18

    FirebaseUserのreload()関数がフラッターになっているユースケースは何ですか?

  19. 19

    Factoryメソッドパターンは、テンプレートメソッドパターンの特殊なケースですか?

  20. 20

    Kotlin MPPプラグインを使用する場合、単純な依存関係とソースセットの依存関係の違いは何ですか?

  21. 21

    「のインスタンス」「のタイプ」のユースケースは何ですか?

  22. 22

    http.createServerメソッドに追加されたオプション引数のユースケースは何ですか

  23. 23

    MVCで「Create」コントローラーメソッドをユニットテストするのに十分なテストは何ですか?

  24. 24

    スプライスメソッドの2番目のパラメータは何をしますか?

  25. 25

    Pythonの適切なエンドレスソケットサーバーループとは何ですか

  26. 26

    メソッドが終了する前に、インスタンスメソッドで弱いメンバーをnullにできるのはなぜですか?

  27. 27

    AWSパラメータストアの値を暗号化するユースケースは何ですか?

  28. 28

    インターフェイスとクラスの違いは何ですか?また、クラスにメソッドを直接実装できるのに、なぜインターフェイスを使用する必要があるのですか?

  29. 29

    クロスプラットフォームのオープンソースUIに依存しないC#クラスライブラリに選択するVisual Studio 2017プロジェクトタイプとその理由は何ですか?

ホットタグ

アーカイブ