2017-04-05 16 views
5

Aのタイプになる方法はありますかSome[A]からですか?`` [A] `から` A`に移動

type X = Some[Int] 
type Y = ??? // what do I have to write here to get `Int` 

私はこれを可能に私自身のOption型定義することができます。

sealed trait Option[+A] 
case object None extends Option[Nothing] 
case class Some[+A](a: A) { 
    type Inner = A 
} 

をしてから

type X = Some[Int] 
type Y = X#Inner 

を使用するが、これは通常のScalaのオプションタイプで何とかも可能ですか?答えは重く華麗なプレゼンテーションのこのスライドからインスピレーションを得ている

trait IsOption[F]{ 
    type T  
    def apply(f: F): Option[T] 
    } 
    object IsOption{ 
    def apply[F](implicit isf: IsOption[F]) = isf  
    implicit def mk[A] = new IsOption[Option[A]]{ 
     type T = A  
     def apply(f: Option[A]): Option[A] = f 
    } 
    } 
    def getInner[A](in:A)(implicit inner: IsOption[A]): Option[inner.T] = inner(in) 

http://wheaties.github.io/Presentations/Scala-Dep-Types/dependent-types.html#/2/1

あなたは受信機能を持ってここに

+0

それがhttpsのことを思い出す:// stackoverflow.com/questions/29038214/why-scala-does-not-have-a-decltypeとhttps://stackoverflow.com/questions/29034921/can-function-type-be-defined-by-inference – Suma

+1

私は思います一般的に、これは可能ではないかもしれませんが、あなたのユースケースに応じて 'def x [T](opt:Option [T]){/ * Tはここで利用可能です* /}'またはパスに依存するty pe。 –

答えて

2

が値からタイプを回復するために、パス依存型を使用するソリューションです。不透明なAですが、それは暗黙のうちにIsOption[A]を介してオプションとインナータイプであるという事実を回復します。

これはあなたが求めているものではなく、そのような型依存型を使用するときには分かりました。あなたはタイプを回復する具体的な値を持つ必要があります。

+0

この解決法では、型 'T'を得るために 'A'値を持つ必要はなく、暗黙の' IsOption [A] '(必要に応じて常にスコープ内にある)だけです。だから、これが頼まれたものです、IMO。 –

+0

しかし、あなたは 'タイプgetterIn [A](暗黙的な内部:IsOption [A])のような関数:Option [inner] {Type [Int]]#T' のような、 .T] = ??? 'は有効ですが、値が限られている可能性があります。 –

+2

'val isOpt = implicitly [Option [T]];を実行できます。タイプインナー= isOpt.T' –

1

次のように、単純型関数を記述することができます

scala> type X = Some[Int] 
defined type alias X 

scala> type F[H <: Option[A], A] = A 
defined type alias F 

scala> type Y = F[X, Int] 
defined type alias Y 

scala> implicitly[Y =:= Int] 
res3: =:=[Y,Int] = <function1> 

を、それは非常に便利ではないが、それが動作する部分の型パラメータアプリケーション/推論がなければ...

関連する問題