构建 Nat N 的固定大小列表
Building Fixed Size List of Nat N
我试图定义一个函数,给定一个 N <: Nat
类型参数,构建一个恰好包含 3 个 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)) ^
但是我不明白为什么会失败。
一个问题是您的 n
被输入为 Nat
,而不是 N
——我认为这只是一个错字。一旦你解决了这个问题,你就可以这样写方法:
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))
但是如果你在元素数量上撒谎,编译器将无法帮助你。
我试图定义一个函数,给定一个 N <: Nat
类型参数,构建一个恰好包含 3 个 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)) ^
但是我不明白为什么会失败。
一个问题是您的 n
被输入为 Nat
,而不是 N
——我认为这只是一个错字。一旦你解决了这个问题,你就可以这样写方法:
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))
但是如果你在元素数量上撒谎,编译器将无法帮助你。