Scala中的异构列表;使用地图功能

时间:2013-10-13 15:51:37

标签: list scala map shapeless heterogeneous

所以问题出现在无形库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没问题!

1 个答案:

答案 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元素是一个函数从一个字符串(或任何你的对象类型)到某个东西时,你需要表示这个案例适用的事实。