所以问题出现在无形库https://github.com/milessabin/shapeless的理解HLists中;
我正在使用HLists
来存储一些函数,即:
val list = HList(
function1(_),
function2(_),
....
functionn(_)
);
它完美无缺:我可以从列表中获取任何功能并应用它:
list.head(object)
但是,我在使用map
函数(list map mapFunc
)时遇到问题:
object mapFunc extends Poly1 {
implicit def default[T] =
at[T](t => {
t(obj)
})
}
它说Application doesnt take parameters
。那我该怎么处理呢?我不懂smth?我是Scala的新手。
P.S。构造函数有一个有趣的效果,这段代码构建错误:
function1(_) :: function2(_) :: HNil
它被识别为某种类型的函数,但HList(function1(_), function2(_))
具有正确的类型。
修改
'P.S。'决定了 - function1(_) :: function2(_) :: HNil
真的有类型不匹配;但是function1 _ :: function2 _ :: HNil
没问题!
答案 0 :(得分:4)
首先是您的上一个问题 - 您需要使用HNil
而不是HList
来结束列表。因此,如果我们有以下内容:
def function1(s: String) = "foo " + s
def function2(s: String) = s.toInt
def function3(s: String) = s + " bar"
我们写道:
val list = function1 _ :: function2 _ :: function3 _ :: HNil
因为::
就像你在Scala标准库(和其他语言)中找到的cons运算符一样,它需要它的第一个参数(一个项目)并将它预先添加到它的第二个(一个列表)
现在提出第一个问题。鉴于我刚刚定义的HList
,我们可以写下以下内容:
val obj = "13"
object mapFunc extends Poly1 {
implicit def funcTo[T] = at[String => T](f => f(obj))
}
然后:
scala> (list map mapFunc) == "foo 13" :: 13 :: "13 bar" :: HNil
res0: Boolean = true
关键是当map元素是一个函数从一个字符串(或任何你的对象类型)到某个东西时,你需要表示这个案例适用的事实。