0

タイプの制限を強制するタイプ Union が必要だったので、hereの回答に従って、 Union を次のように定義しました。

sealed trait Value[T]
object Value{
  implicit object NumberWitness extends Value[Int]
  implicit object StringWitness extends Value[String]
}

さて、この型共用体によってパラメータ化されたリストまたはクラスを作成するにはどうすればよいですか? そうすることは可能ですか?? repl で次の構文を試しましたが、運がありませんでした:

scala> import Value._
import Value._

scala> def list[V: Value] = List("hello", 1)
list: [V](implicit evidence$1: Value[V])List[Any]

scala> list
<console>:18: error: ambiguous implicit values:
 both object NumberWitness in object Value of type Value.NumberWitness.type
 and object StringWitness in object Value of type Value.StringWitness.type
 match expected type Value[V]
       list
       ^

または、scalaz や cats などの高度な FP ライブラリでそれを行うことは可能ですか??

4

1 に答える 1

2

これは型共用体ではなく、型クラスと呼ばれます。そして、これらは、 または とともに動作するメソッドを記述できるようにすることを目的としています。IntString

def listOfValues[V: Value](x: V) = List(x)
listOfValues(1) // works
listOfValues("") // works
listOfValues(0.0) // doesn't work
listOfValues(1, "") // doesn't work

異なる種類の混合を許可しないでください。

存在型を使用してそれを行うことができます。

case class WithValue[V: Value](x: V)
object WithValue {
  implicit def withValue[V: Value](x: V) = WithValue(x)
}

def list = List[WithValue[_]]("hello", 1)

しかし、実際にそれを行うことはお勧めしません。あなたの問題を解決するためのより良い方法がある可能性が非常に高いです。

特に、単純に使用することを検討してください。

// not sealed if you need to add other types elsewhere
// can be Value[T] instead
sealed trait Value 
case class IntValue(x: Int) extends Value
case class StringValue(x: Int) extends Value

// add implicit conversions to IntValue and StringValue if desired
List(StringValue("hello"), IntValue(1))
于 2016-07-05T17:24:24.507 に答える