List Scala中的异构列表;使用map函数

List Scala中的异构列表;使用map函数,list,scala,map,shapeless,heterogeneous,List,Scala,Map,Shapeless,Heterogeneous,因此,问题在于理解无形图书馆的名单; 我正在使用HLists存储一些函数,例如: val list = HList( function1(_), function2(_), .... functionn(_) ); 它工作得非常完美:我可以从列表中获取任何函数并应用它: list.head(object) 但是,我在使用map函数(list map mapFunc)时遇到问题: 它说,应用程序不接受参数。那我该怎么处理呢?我不懂smth?我是斯卡拉的新手 p、

因此,问题在于理解无形图书馆的名单; 我正在使用
HLists
存储一些函数,例如:

val list = HList(
    function1(_),
    function2(_),
    ....
    functionn(_)
);
它工作得非常完美:我可以从列表中获取任何函数并应用它:
list.head(object)

但是,我在使用
map
函数(
list map mapFunc
)时遇到问题:

它说,
应用程序不接受参数。那我该怎么处理呢?我不懂smth?我是斯卡拉的新手

p、 构造函数有一个有趣的效果,这段代码构建的lil位不正确:

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

编辑


“p.s.”已确定-
function1(:):function2(:):HNil
确实存在类型不匹配;但是
function1\u::function2\u::HNil
是可以的

首先,对于最后一个问题,您需要以
HNil
而不是
HList
来结束列表。例如,如果我们有以下内容:

def function1(s: String) = "foo " + s
def function2(s: String) = s.toInt
def function3(s: String) = s + " bar"
val obj = "13"

object mapFunc extends Poly1 {
  implicit def funcTo[T] = at[String => T](f => f(obj))
}
我们会写:

val list = function1 _ :: function2 _ :: function3 _ :: HNil
因为
::
类似于Scala标准库(和其他语言)中的cons运算符,它接受第一个参数(一个项)并将其前置到第二个参数(一个列表)

现在回答你的第一个问题。考虑到我刚刚定义的
HList
,我们可以编写以下内容:

def function1(s: String) = "foo " + s
def function2(s: String) = s.toInt
def function3(s: String) = s + " bar"
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元素是从字符串(或任何对象类型)到某个对象的函数时,case适用。

oh sry,真的
HNil
,我在写问题时犯了一个错误,修复了,thx!嗯,是的,我明白了,真的很激动人心;如果我想有很多不同的功能,从不同的类型到其他类型?像~
def function1(s:Type1)=convertType1ToType2
<代码>定义函数n(s:Typen-1)=转换类型n-1转换类型
;我的意思是像[FromType=>ToType]那样的smth;mb有一种方法可以不写所有的案例来应用隐式函数?@DaunnC如果你想把函数列表应用到参数列表,那么你应该调查zipApply。。。但这是一个不同的问题。嗯,目的不是准确地应用,而是在使用map之后,让函数保持它们的r(具有它们的类型和应用的可能性)。所以对于exmpl,我得到了一些其他对象;我想在它里面传递函数:
implicit def funcTo[T]=at[T](T=>someObject.hlist=T::someObject.hlist)
应用这个映射函数之后,我们将得到
someObject
,其中hlist在:
someObject.hlist
;但是,如果我们按照我上面写的那样做,我们就不能应用这个新HList中的函数:
someObject.HList.head(object)
将给我们
应用程序不接受参数
错误。我不明白为什么在创建函数列表时忽略函数参数周围的括号很重要;如果我们走得太远,也许有一个有用的参考?