代码之家  ›  专栏  ›  技术社区  ›  DaunnC

Scala中的异构列表;使用映射函数

  •  3
  • DaunnC  · 技术社区  · 11 年前

    所以问题在于理解不成形图书馆的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 。那么我该怎么处理呢?我不懂smth?我是斯卡拉的新手。

    附言:构造函数有一个有趣的效果,这个代码构建得有点不正确:

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

    编辑

    决定了“p.s.”- 函数1(_)::函数2(_)::HNil 确实存在类型不匹配;但是 function1 _ :: function2 _ :: HNil 可以!

    1 回复  |  直到 11 年前
        1
  •  4
  •   Travis Brown    11 年前

    首先,对于你的最后一个问题,你需要用 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元素是一个从字符串(或任何对象类型)到某种东西的函数时,您需要表示这种情况适用的事实。