2016-10-05 2 views
1

N <: Nat 유형 매개 변수가 주어진 정확히 3 N의 목록을 작성하는 함수를 정의하려고했습니다.건물 고정 크기 목록 Nat N

import shapeless._ 
import shapeless.nat._ 

scala> def natNOfSize3[N <: Nat](n: Nat): Sized[List[N], _3] = 
    Sized[List, _3](List(n, n, n)) 
<console>:17: error: wrong number of type parameters for overloaded method value apply with alternatives: 
    [CC[_]]()(implicit cbf: scala.collection.generic.CanBuildFrom[Nothing,Nothing,CC[Nothing]], implicit ev: shapeless.AdditiveCollection[CC[Nothing]])shapeless.Sized[CC[Nothing],shapeless._0] <and> 
    [CC[_]]=> shapeless.SizedBuilder[CC] 

     def natNOfSize3[N <: Nat](n: Nat): Sized[List[N], _3] = Sized[List, _3](List(n, n, n))   ^

하지만 왜 실패했는지 이해할 수 없습니다.

+0

Travis와 마찬가지로 Sized (...)에 대한 인수가 잘못되었으므로 요소 대신 모음을 전달합니다. 참고 : Sized.apply는 SizedBuilder를 반환합니다. https://github.com/milessabin/shapeless/blob/master/core/src/main/scala/shapeless/sized.scala SizedBuilder.apply는 다음 요소를 가져옵니다. // github .com/milessabin/shapeless/blob/b73453bab27e73b6aa1206805e73ec583852309d/project/Boilerplate.scala 컴파일러 매직은 단일 함수 호출처럼 보입니다. –

+0

흥미 롭 - https://github.com/milessabin/shapeless/blob/b73453bab27e73b6aa1206805e73ec583852309d/project/Boilerplate.scala#L428, Marcus. 이'Boilerplate' 클래스에 대한 의견을 권해 주실 수있는 블로그 게시물은 무엇입니까? –

+0

그러나 내가 알고있는 블로그 글은 https://github.com/milessabin/shapeless/blob/b73453bab27e73b6aa1206805e73ec583852309d/project/Boilerplate.scala#L115에서 충분히 설명 할 수 없습니다. –

답변

2

하나의 이슈는 nNat이 아닌 N이 아닌 것입니다. 단지 오타라고 가정합니다. Sized.apply 종류 * -> * 단일 유형의 매개 변수를 사용

import shapeless._, nat._ 

def natNOfSize3[N <: Nat](n: N): Sized[List[N], _3] = Sized[List](n, n, n) 

하는 것으로, 대신 컬렉션을 제공, 당신은 요소를 제공합니다 : 당신이 것을 해결 한 후에는 다음과 같은 방법을 쓸 수 있습니다.

def natNOfSize3[N <: Nat](n: N): Sized[List[N], _3] = Sized.wrap(List(n, n, n)) 

을하지만 요소의 수에 대해 거짓말을 한 경우 다음 컴파일러는 당신을 도울 수 될 수 없습니다 :

당신이 정말로 모음을 전달하려는 경우, 당신은 wrap 사용할 수 있습니다 .

+0

그 종류가'* -> *'인지 어떻게 알 수 있습니까? https://github.com/milessabin/shapeless/blob/b73453bab27e73b6aa1206805e73ec583852309d/core/src/main/scala/shapeless/sized.scala#L29, Travis? –

+1

@KevinMeredith 동반자에서 [the'apply'] (https://github.com/milessabin/shapeless/blob/b73453bab27e73b6aa1206805e73ec583852309d/core/src/main/scala/shapeless/sized.scala#L189)를 봐야합니다. 목적. –