我试图像在Scala中使用Haskell的'concat'一样实现'concat'。
但我没有做到。
$ scala
Welcome to Scala version 2.7.7.final (Java HotSpot(TM) Client VM, Java 1.6.0_14).
Type in expressions to have them evaluated.
Type :help for more information.
scala>
scala> def concat(ll:List[List[Any]]):List[Any] = { ll match { case List(List()) => Nil; case (x::xs) => x ::: concat(xs) }}
concat: (List[List[Any]])List[Any]
scala> concat(List(1,2)::List(3,4)::Nil)
scala.MatchError: List()
at .concat(<console>:67)
at .concat(<console>:67)
at .concat(<console>:67)
at .<init>(<console>:68)
at .<clinit>(<console>)
at RequestResult$.<init>(<console>:3)
at RequestResult$.<clinit>(<console>)
at RequestResult$result(<console>)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeM...
scala> List(1,2)::List(3,4)::Nil
res47: List[List[Int]] = List(List(1, 2), List(3, 4))
这个错误是否是由于Scala的错误造成的?
谢谢。
答案 0 :(得分:3)
您的匹配不包括空列表的情况。你有一个案例列表(List())(可能更好地写为List(Nil))和一个非空列表的案例。如果你添加“case Nil =&gt; Nil”,它就可以了。
scala> def concat(ll:List[List[Any]]):List[Any] = { ll match { case List(Nil) => Nil; case (x::xs) => x ::: concat(xs); case Nil => Nil }}
concat: (List[List[Any]])List[Any]
scala> concat(List(1,2)::List(3,4)::Nil)
res0: List[Any] = List(1, 2, 3, 4)
兰德尔舒尔茨