元组序列上的Scala折叠
我想对以下方法应用折叠操作:元组序列上的Scala折叠,scala,Scala,我想对以下方法应用折叠操作: def rec(id: String, elems: Seq[(String, MyCase)]) = { elems.fold(Seq.empty[(String, Seq[String])] { elem => .... } } 我不明白的是元素的类型是什么,我不明白为什么它应该是什么!有什么线索吗?第二次编辑: 我是个白痴。折叠必须返回与输入类型相同的值。 例如,用折叠式折叠式折叠式折叠式折叠式折叠式折叠式折叠式折叠式折叠式折叠式折叠式
def rec(id: String, elems: Seq[(String, MyCase)]) = {
elems.fold(Seq.empty[(String, Seq[String])] { elem =>
....
}
}
我不明白的是元素的类型是什么,我不明白为什么它应该是什么!有什么线索吗?第二次编辑:
我是个白痴。折叠必须返回与输入类型相同的值。
例如,用折叠式折叠式折叠式折叠式折叠式折叠式折叠式折叠式折叠式折叠式折叠式折叠式折叠式折叠式折叠式折叠式折叠式折叠式折叠式折叠式折叠式折叠。
无法在标准折叠中转换数据类型。
它是为我编译的,但我没有注意到返回类型是无用的
折叠中的第二个参数是一个函数:
(ResultType, SingleElement) => Result Type
在这种情况下
(Seq[(String, Seq[String])], Seq[(String, MyCase)]) => Seq[(String, Seq[String])]
您的代码在第二个参数上只有一个输入,因此编译器不知道它是什么。所以它应该看起来像:
elems.foldLeft(Seq.empty[(String, Seq[MyCase])] {(zeroSeq, nextElem) =>
//zeroSeq: Seq.empty[(String, Seq[MyCase]
//nextElem: (String, MyCase)
}
编辑:
以下示例编译:
case class MyCase(x: String)
val elems: Seq[(String, MyCase)] = Seq(("Hi", MyCase("B")))
elems.foldLeft(Seq.empty[(String, Seq[MyCase])]){(z, s) =>
z
}
第二次编辑:
我是个白痴。折叠必须返回与输入类型相同的值。
例如,用折叠式折叠式折叠式折叠式折叠式折叠式折叠式折叠式折叠式折叠式折叠式折叠式折叠式折叠式折叠式折叠式折叠式折叠式折叠式折叠式折叠式折叠。
无法在标准折叠中转换数据类型。
它是为我编译的,但我没有注意到返回类型是无用的
折叠中的第二个参数是一个函数:
(ResultType, SingleElement) => Result Type
在这种情况下
(Seq[(String, Seq[String])], Seq[(String, MyCase)]) => Seq[(String, Seq[String])]
您的代码在第二个参数上只有一个输入,因此编译器不知道它是什么。所以它应该看起来像:
elems.foldLeft(Seq.empty[(String, Seq[MyCase])] {(zeroSeq, nextElem) =>
//zeroSeq: Seq.empty[(String, Seq[MyCase]
//nextElem: (String, MyCase)
}
编辑:
以下示例编译:
case class MyCase(x: String)
val elems: Seq[(String, MyCase)] = Seq(("Hi", MyCase("B")))
elems.foldLeft(Seq.empty[(String, Seq[MyCase])]){(z, s) =>
z
}
您缺少了
{
前面的右括号,这就是为什么您的IDE可能认为类型是Nothing
此外,您可能正在查找foldLeft
,而不是fold
(后者的第一个参数必须与序列的元素类型匹配)
现在,Seq[A]
上的.foldLeft
的(简化)签名是:
foldLeft[B](b: B)(f: (B,A) => B)
如您所见,它使用一个函数,将Tuple2
转换为第一个参数的类型。tuple的第一个元素与第一个参数的类型相同,第二个元素与序列的元素的类型相同
在您的示例中,B
是Seq[(String,Seq[String])]
,序列元素是(String,MyCase)
。因此,函数的输入类型将采用如下可怕的元组:
(Seq[(String, Seq[String])], (String, MyCase))
您缺少了
{
前面的右括号,这就是为什么您的IDE可能认为类型是Nothing
此外,您可能正在查找foldLeft
,而不是fold
(后者的第一个参数必须与序列的元素类型匹配)
现在,Seq[A]
上的.foldLeft
的(简化)签名是:
foldLeft[B](b: B)(f: (B,A) => B)
如您所见,它使用一个函数,将Tuple2
转换为第一个参数的类型。tuple的第一个元素与第一个参数的类型相同,第二个元素与序列的元素的类型相同
在您的示例中,B
是Seq[(String,Seq[String])]
,序列元素是(String,MyCase)
。因此,函数的输入类型将采用如下可怕的元组:
(Seq[(String, Seq[String])], (String, MyCase))
这是因为您不仅希望
折叠
,还希望映射
元组,请参见折叠方法签名:
def fold[A1 >: A](z: A1)(op: (A1, A1) => A1): A1 = foldLeft(z)(op)
输入类型和输出类型必须相同:A1
因此,如果要映射,您可能需要尝试foldLeft
:
def foldLeft[B](z: B)(op: (B, A) => B): B =
输出类型B
有一个泛型,不绑定到a
我们还可以找到折叠
源代码正在调用:
def fold[A1 >: A](z: A1)(op: (A1, A1) => A1): A1 = foldLeft(z)(op)
使用foldLeft
可能类似于:
elements.fold(Seq.empty[(String, Seq[String])])((a, b) => a ++ Seq((b._1, Seq[String]())))
这是因为您不仅希望
折叠
,还希望映射
元组,请参见折叠方法签名:
def fold[A1 >: A](z: A1)(op: (A1, A1) => A1): A1 = foldLeft(z)(op)
输入类型和输出类型必须相同:A1
因此,如果要映射,您可能需要尝试foldLeft
:
def foldLeft[B](z: B)(op: (B, A) => B): B =
输出类型B
有一个泛型,不绑定到a
我们还可以找到折叠
源代码正在调用:
def fold[A1 >: A](z: A1)(op: (A1, A1) => A1): A1 = foldLeft(z)(op)
使用foldLeft
可能类似于:
elements.fold(Seq.empty[(String, Seq[String])])((a, b) => a ++ Seq((b._1, Seq[String]())))
我没有在上看到
fold
函数。MyCase的类型是什么?是的,标题有误导性。它是一个元组序列上的折叠。我已经调整了标题,但内容仍然有效。在其他评论之后,请发布您的问题的摘要,以便我们可以轻松地在本地重建问题。我没有看到fold
函数继续。MyCase的类型是什么?是的,标题有误导性。它是一个元组序列的折叠。我已经调整了标题,但内容仍然有效。在其他评论之后,请发布您的问题的摘要,以便我们可以轻松地在本地重建问题。不!这甚至没有编译!仍然没有!z和s的类型是相等的这是我所期望的!尝试用实际类型限定z和s,您将看到它无法编译!s:String和z:Seq[String]编译失败我不喜欢你大喊大叫。同时,在这一点上,你将不得不倾听关于你的问题的评论并添加更多细节。我不确定任何人还能做什么。不!这甚至不能编译!仍然不能!z和s的类型与我期望的相同!尝试用实际类型限定z和s,然后你我会看到它无法编译!s:String和z:Seq[String]编译失败我不喜欢你大喊大叫。而且在这一点上,你将不得不听取关于你的问题的评论,并添加更多细节。我不确定任何人还能做些什么。