2016-07-20 7 views
2

これは、型を制限することなく契約を定義するためにScalaで使用することを検討しているパターンですが、流暢なAPIはすべて冗長な意味を持たずに残しています[..]。Scalaの型クラスAPI

アイデアはそうのような型クラスの上に暗黙のクラスを構築することです:

val sum = n1.add(n2) 

の代わりに::

あなたがすることができる範囲で右暗黙で今

implicit class NumberLikeApi[N : NumberLike](n: N) 
    def add(n2: N): N = implicitely[NumberLike[N]].add(n, n2) 
} 

val sum = implicitly[NumberLike[N]].add(n1, n2) 

私の質問:暗黙のクラス部分を自動化/生成することはどういうわけかできますか?これは基本的に型クラスの複製です。

言語&標準ライブラリで何かを見つけることができませんでした。おそらくこれを行うことができるライブラリのどこかにマクロがありますか?

答えて

3

simulacrumの目的はまさにこれです。

そのREADMEから、あなたは

import simulacrum._ 

@typeclass trait Semigroup[A] { 
    @op("|+|") def append(x: A, y: A): A 
} 

を書き込み、素晴らしい!この1知りませんでした

// instance for Semigroup[Int] 
implicit val semigroupInt: Semigroup[Int] = new Semigroup[Int] { 
    def append(x: Int, y: Int) = x + y 
} 

import Semigroup.ops._ 

1 |+| 2 // 3 
+0

のようにそれを使用することができます。何とか私の検索の試みでそれを見つけることができませんでした。多くのおかげで、これはパターンをいくらか利用可能にします。 –

関連する問題