Generics 如何在Scala中迭代列表列表?
我正在尝试为在Scala中保存列表的列表对象实现自己的通用扁平化。 在这一点上,我有Generics 如何在Scala中迭代列表列表?,generics,scala,list,Generics,Scala,List,我正在尝试为在Scala中保存列表的列表对象实现自己的通用扁平化。 在这一点上,我有 def myFlatten[T](list: List[List[t]]): List[T] = { for (xs <- list) for (x <- xs) yield x } def myflant[T](list:list[list[T]]):list[T]={ for(xsdef myflatte[T](list:list[list[T]])=for(xs非常接
def myFlatten[T](list: List[List[t]]): List[T] = {
for (xs <- list)
for (x <- xs) yield x
}
def myflant[T](list:list[list[T]]):list[T]={
for(xsdef myflatte[T](list:list[list[T]])=for(xs非常接近!下面是一个有效的方法:
scala> def myFlatten[T](list: List[List[T]]): List[T] = for (xs <- list; x <- xs) yield x
myFlatten: [T](list: List[List[T]])List[T]
了解如何在不使用for
语法糖的情况下编写此函数很有帮助
scala> def myFlatten[T](list: List[List[T]]): List[T] = list flatMap identity
myFlatten: [T](list: List[List[T]])List[T]
scala> myFlatten(List(List(1, 2), List(3)))
res3: List[Int] = List(1, 2, 3)
更新
顺便说一句,List[List[T]
可以展平为List[T]
这一事实是List
是单子的50%原因。通常,这被称为join
。另外50%来自这样一个事实:您可以跨List[a]
映射函数a=>B
,从而生成List[B]
。此函数的通用名称是函子映射
为类型构造函数M
定义Monad的另一种方法是使用纯
操作,该操作获取类型A
的值,并返回M[A]
;以及bind
操作,该操作获取M[A]
,函数A=>M[B]
,并产生M[B]
。对于列表,pure
=List()
,和bind
=(l:List[A],f:(A=>List[B])=>l.flatMap(f)
就个人而言,我喜欢这种风格:
def myFlatten[T](list: List[List[t]]): List[T] = for {
xs <- list
x <- xs
} yield x
def myflant[T](list:list[list[T]):list[T]=for{
xs
scala> def myFlatten[T](list: List[List[T]]): List[T] = list flatMap identity
myFlatten: [T](list: List[List[T]])List[T]
scala> myFlatten(List(List(1, 2), List(3)))
res3: List[Int] = List(1, 2, 3)
def myFlatten[T](list: List[List[t]]): List[T] = for {
xs <- list
x <- xs
} yield x