2016-10-05 8 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

Как сказал Трэвис, ваши аргументы в Sized (...) неверны, вы передаете коллекцию, а не только элементы. Примечание: Sized.apply возвращает SizedBuilder https://github.com/milessabin/shapeless/blob/master/core/src/main/scala/shapeless/sized.scala SizedBuilder.apply принимает элементыhttps: // 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

Одна проблема заключается в том, что ваш n напечатан как Nat, а не N -I предполагаю, что это только опечатка. После того, как вы исправили, что вы можете написать метод, как это:

import shapeless._, nat._ 

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

Обратите внимание, что Sized.apply принимает один параметр типа доброго * -> *, и вместо того, чтобы обеспечить сбор, вы предоставляете элементы.

Если вы действительно хотите передать в коллекции, вы можете использовать wrap:

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

Но тогда компилятор не собирается быть в состоянии помочь вам, если вы солгали о количестве элементов ,

+0

Как вы знаете, что его вид «* -> *» из https://github.com/milessabin/shapeless/blob/b73453bab27e73b6aa1206805e73ec583852309d/core/src/main/scala/shapeless/sized.scala#L29, Travis? –

+1

@KevinMeredith Вам нужно посмотреть [«применить»] (https://github.com/milessabin/shapeless/blob/b73453bab27e73b6aa1206805e73ec583852309d/core/src/main/scala/shapeless/sized.scala#L189) в компаньоне объект. –

 Смежные вопросы

  • Нет связанных вопросов^_^