2014-03-12 2 views
0

이것은 this question과 관련되어 있지만 실재 형식을 사용하면 어떻게 도움이되는지 알 수 없습니다. 개체의 스칼라 유형 매개 변수

나는 다음과 같은 달성하기 위해 노력하고있어 :

type MonadicArithmeticFunc[S] = (Int, S) => (Int, S) 

object addOne[S] extends MonadicArithmeticFunc[S] { 
    def apply(n: Int, s: S): (Int, S) = (n + 1, s) 
} 

val state = Seq.empty[Int] 
println(addOne(4, state)) 

을 하나의 객체에 유형 매개 변수를 추가 할 수 없습니다 그러나이 작동하지 않습니다. 적용 방법은 Function2의 형식 매개 변수를 어떤 아니므로,

object addOne extends MonadicArithmeticFunc[_] { 
    def apply[S](n: Int, s: S): (Int, S) = (n + 1, s) 
} 

그러나 물론 중 하나가 작동하지 않는 : 나는 또한 실존 유형을 사용했습니다. 나도 같은 범위 지정을 얻을 수있는 패키지 객체에 그 선언해야 할 것 제외

def addOne[S](n: Int, s: S): (Int, S) = (n + 1, s) 

:

나는 기본 데프을 사용할 수 있습니다. 다른 아이디어?

+0

ArithmeticFunc는 어떤 의미에서든 모나드가 아니며 수퍼 클래스로 사용할 이유가 없으므로 단순히 Object addOne {def apply [S] (n : Int, s : S) : (Int, S) = (n + 1, s)}'. 당신이하려는 일에 대해 정교하게 설명 할 수 있겠습니까? 두 가지 유형 패턴이 당신의 삶을 편하게 만들거나 스카치가되는 것처럼 보입니다. 상태 모나드 – 4lex1v

+0

그냥 궁금 해서요. 왜 패키지 오브젝트에 뭔가 넣는 것을 피하겠습니까? –

+0

문제는'addOne'을 함수 객체로 사용할 수 있기를 원하고,'S '의 타입이 다른 다양한 경우에 사용하고 싶다는 것입니다. 'addOne'은 S가 무엇인지 신경 쓰지 않기 때문에 괜찮을 것입니다. 그냥 통과하는 것입니다. 하지만 지금은 JVM에서 그렇게 될 수 없다는 것을 알고 있습니다. –

답변

2

그것은 단순히 addOne[Int]addOne[String]은 (아마도) 다른 개체 것이기 때문에, object에 대한 (그 문제에 대한 또는 생성자 매개 변수)를 입력 매개 변수를 가지고 이해가되지 않습니다,하지만 단 하나가 있어야 키워드 object 의미 목적. 어떤 이유로 든 MonadicArithmeticFunc이 필요한 경우

class addOne[S] extends MonadicArithmeticFunc[S] { 
    def apply(n: Int, s: S): (Int, S) = (n + 1, s) 
} 

object addOne { 
    def apply[S] = new addOne[S] 
} 

일 수 있습니다. 그러나 Alexlv가 말했듯이,

object addOne { 
    def apply[S](n: Int, s: S) = (n + 1, s) 
} 

이 일반적으로 바람직합니다.

+0

나는 class + object 예제를 좋아한다. 시도해 볼게. –

+0

예, 이것이 JVM의 한계임을 알 수 있습니다. 각 유형마다 서로 다른 객체가 있습니다. 'addOne'은'S'의 실제 타입이 무엇인지 신경 쓰지 않기 때문에, 나는 Function2에 대한 하나의 런타임 객체 만 가지기를 원했습니다 - 런타임에'S'가'Object'가 되겠지요. 모든 유형에 대해'addOne'의 인스턴스를 따로 할당하면됩니다. –