私は内部DSLを書いています。型の安全を守るためにShapelessを使っています。しかし、私は問題を抱えている。シェイプレス:多型関数の型制約のチェック
問題の簡略版は次のとおりです。
は、以下のコードを検討:
import shapeless._
import syntax.std.function._
import ops.function._
implicit class Ops[P <: Product, L <: HList](p: P)(implicit val gen: Generic.Aux[P, L]) {
def ~|>[F, R](f: F)(implicit fp: FnToProduct.Aux[F, L ⇒ R]) =
f.toProduct(gen.to(p))
}
(1, 2) ~|> ((x: Int, y: Int) ⇒ x + y) // -> at compile time, it ensures the types are aligned.
(1, 2, 3) ~|> ((x: Int, y: Int, z: Int) ⇒ x + y + z) // -> compiles okay
(1, "2", 3) ~|> ((x: Int, y: Int, z: Int) ⇒ x + y + z) // -> gives a compile error, as expected.
の代わりにAのしかし、私は、コンテナタイプPlace[A]
を使用したいです。
case class Place[A](a: A)
val a = Place[Int](1)
val b = Place[Int]("str")
であり、タイプパラメータに対してタイプが揃っていることを保証します。ある
(a, b) ~|> ((x: Int, y: String) ⇒ x.toString + y)
、上記の場合において、Iは、それぞれどのような場合において、Int
とString
、[_]プレースの型パラメータに基づいてチェックするタイプたいです。
非常に助けていただきありがとうございます。
ちょうどヒントです。私は現在、それを試す時間がありません。 hlistの制約が役立つかもしれません:https://github.com/milessabin/shapeless/blob/master/core/src/main/scala/shapeless/hlistconstraints.scala –
あなたの入力 'P <:Product'型の' 「A」になるだろうか?コンテナで具体的に何をしようとしていますか? – flavian
@flavianでは、以前の計算のために、値は 'Place [_] 'で幾分既に持ち上げられています。この場合、型が整列していることを確認したいと思います。これに加えて、関数を後で(最初の例とは異なり)解釈できるように、関数をコンテナに持ち上げることを考えています。 –