2013-10-12 4 views
1

필자는 "함수 프로그래밍 원리"에서 "팩 함수"연습을했습니다.빈 인자 목록 전달

List[List[T]]에 연속 복제본을 넣습니다.

input: List("a", "a", "b", "b", "c", "a") 
output: List(List(a, a), List(b, b), List(c), List(a)) 

이 기능을 감안할 때 ...

def pack[T](xs: List[T]): List[List[T]] = { 
    def go[T](ys: List[T], acc: List[List[T]]) : List[List[T]] = ys match { 
     case Nil => acc 
     case x :: xs_ => val r: List[T] = ys.takeWhile(a => a == x) 
         go(ys.drop(r.length), acc :+ r) 
    } 
    go(xs, List(Nil).filter(_ != Nil)) // *** line in question *** 
} 

는 내부 목록이 비어있는 List[List[T]]에 전달할 수있는 더 나은 방법이 있나요?

거기에 filter이 없으면 pack(...)의 결과는 List()입니다.

답변

2

왜 그냥 ........... :

go(xs, Nil) 

BTW,이 문제에 대한 나의 해결책이 여기

def pack[T](xs: List[T], 
      acc: List[List[T]] = Nil): List[List[T]] = 
    (xs, acc) match { 
    case (Nil, _) => acc 
    case (i:+last, (h::t1)::t2) if last == h => pack(i, (last::h::t1)::t2) 
    case (i:+last, acc0) => pack(i, List(last)::acc0) 
    } 

과는 또 다른 솔루션 :

def pack[T](xs: List[T]): List[List[T]] = xs match { 
    case Nil => Nil 
    case x::rs => pack(rs) match { 
     case ([email protected]`x`::_)::t => (x::h)::t 
     case t => List(x)::t 
    } 
} 
+0

왜냐하면 ... [case 객체 Nil extends List \ [Nothing \]] (https://github.com/scala/scala/blob/v2.10.2/src/library/scala/collection/immutable/) List.scala # L334) 그래서 닐 <: 리 이 경우 List T [N] <: List Jamil

+0

@ Jamil 또한 Nil <: List [Nothing] <: List [List [T] ] – Eastsun

+0

같은 말을하려고합니다. 대답에 설명을 추가할까요? – Jamil