3

所以问题在于无形库的理解 HLists https://github.com/milessabin/shapeless;我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。那么我该如何处理呢?Mb 我不明白吗?我是 Scala 的新手。

ps 构造函数有一个有趣的效果,这段代码正在构建 lil 有点不正确:

function1(_) :: function2(_) :: HNil它被识别为某种类型的函数,但HList(function1(_), function2(_))具有正确的类型。

编辑

'ps' 已决定——function1(_) :: function2(_) :: HNil确实有类型不匹配;但function1 _ :: function2 _ :: HNil没关系!

4

1 回答 1

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 元素是从字符串(或任何您的对象类型)到某物的函数时,这种情况适用。

于 2013-10-13T16:10:24.490 回答