Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Generics 如何在Scala中迭代列表列表?_Generics_Scala_List - Fatal编程技术网

Generics 如何在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非常接

我正在尝试为在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(xs
def 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