2016-07-26 9 views
0

、種類はファーストクラスの値です:Scalaで型をファーストクラスの値として使用しますか?イドリスで

FooType : (Type, Type) 
FooType = (Int, Int) 
fst FooType -- Int : Type 

私は別の方法を超えるタイプのメンバーを再利用できるように、Scalaで何とかこの機能を使用したいと思います:

class Foo { 
    type FooType = (Int, Int) 

    def foo : FooType = { ... } 
    def bar : Int = { ... } // Here I would like to reuse the first type of FooType (Int) 
} 

は何ですかScalaでこれを達成するための推奨される方法は?

+0

「FooType」は、定義されたスコープに対して利用可能です。異なるメソッド*で型メンバーを再利用することはどういう意味ですか?どのような場所でも 'FooType'を使うことを妨げているのは何ですか? –

+0

@YuvalItzchakov 'FooType'は' Tuple2 [T1、T2] '型です。' FooType'の型メンバーに基づいてメソッドを定義したいと考えています。単に 'Int'ではなく' 'FooType._1'"(T1)を使用して、定義された型を再利用します。私はこれが可能だとは確信していません。 – jarandaf

+0

ああ、そうだ。 'FooType'をクラスのメンバーに基づいて推定しますか? –

答えて

0

私はあなたが得ることができる最も近いタイプのメンバーを使用していると思わ:

trait TupleType[T] { type Member = T } 

implicit def toTuple[T](a: (T, T)) = new TupleType[T] {} 

type FooType = TupleType[Int] 

def foo: FooType = (1, 2) 
def bar: FooType#Member = 1 

そうでなければあなたは自分の組のメンバー型の型の別名を使用することができます。

type A = Int 
type FooType = (A, A) 

def foo: FooType = (1, 2) 
def bar: A = 1 
0

それは、多かれ少なかれです必要なインフラストラクチャを自分で作成する場合は可能です。スカラ型のレベル関数では実際にファーストクラスではありません。それらは暗黙のうちにライブラリレベルで実装されています。

scala> :paste 
// Entering paste mode (ctrl-D to finish) 

sealed trait Deconstruct[T <: (_,_)] { 
    type fst 
    type snd 

    def fst(t: T): fst 
    def snd(t: T): snd 
} 

object Deconstruct { 
    implicit def mkDeconstruct[A,B] = new Deconstruct[(A,B)] { 
    type fst = A 
    type snd = B 

    def fst(t: (A,B)): A = t._1 
    def snd(t: (A,B)): B = t._2 
    } 
} 

// Exiting paste mode, now interpreting. 

defined trait Deconstruct 
defined module Deconstruct 

scala> type FooType = (Int,Int) 
defined type alias FooType 

scala> def foo: FooType = (1,2) 
foo: (Int, Int) 

scala> def bar(implicit d: Deconstruct[FooType]) = d.fst(foo) 
bar: (implicit d: Deconstruct[(Int, Int)])d.fst 

scala> bar 
res0: Int = 1 
関連する問題