scalaz.IsEmpty
タイプクラスインスタンスを持つものをすべてラップするジェネリックメソッドを作成しようとしていますOption
。空の値を返しNone
、空でない場合はラップしSome
ます。これが私がこれまでに思いついたものです:
import scalaz._
import Scalaz._
def asOption0[C](c: C)(implicit ev: IsEmpty[({ type B[A] = C })#B]) =
if (ev.isEmpty(c)) None else Some(c)
def asOption1[A, C[_]](c: C[A])(implicit ev: IsEmpty[C]) =
if (ev.isEmpty(c)) None else Some(c)
asOption0
のようなプリミティブ型で機能しString
(ラムダ型C
を使用してその形状を示すB[_]
)、次asOption1
のような単項型コンストラクターを持つ型で機能しますList
。
scala> asOption0("")
res1: Option[String] = None
scala> asOption1(List(1,2,3))
res0: Option[List[Int]] = Some(List(1, 2, 3))
scala> asOption0(List(1,2,3))
<console>:17: error: could not find implicit value for parameter
ev: scalaz.IsEmpty[[A]List[Int]]
scala> asOption1("hello")
<console>:17: error: could not find implicit value for parameter
ev: scalaz.IsEmpty[Comparable]
String
、、、List
およびより高い種類のタイプに対して同時に機能する1つのメソッドを作成することは可能ですか?