我是Scala的新手,我对类型系统有疑问.
flatten方法适用于嵌套集合,因此如果我有一个List列表,它会将其展平为List.但是对于已经持平的集合进行扁平处理是没有意义的.当然,Scala类型检查器会将其标记为错误.
List(List(1,2,3),List(4,5,6)).flatten // produces List(1,2,3,4,5,6)
List(1,2,3,4).flatten // type error
Run Code Online (Sandbox Code Playgroud)
我知道这在某种程度上依赖于一个隐含的参数来展平.但我不知道隐含值来自何处,以及如何使用它来断言对象flatten的类型.另外,为什么隐式参数不会出现在List.flatten的scaladoc中?
为了理解它是如何工作的,我们需要看一下 flatten 的类型签名:
\n\ndef flatten[B](implicit asTraversable: (A) \xe2\x87\x92 GenTraversableOnce[B]): List[B]\nRun Code Online (Sandbox Code Playgroud)\n\nA是列表的元素类型,B是每个元素的元素类型。为了使扁平化工作,必须有一个从元素类型到 a 的隐式转换GenTraversableOnce[B]。仅当集合或者您实现自己的隐式转换时才会出现这种情况。例如,您可以为一对定义一个:
implicit def pairToList[A](p:(A,A)) = List(p._1, p._2)\n\nList(1->2,2->3).flatten //compiles! List(1,2,2,3)\nRun Code Online (Sandbox Code Playgroud)\n