2013-05-10 42 views
5

Các mã tiếp theoScala cho-hiểu suy luận kiểu

def f(chars: List[Char]): List[List[Char]] = chars match { 
    case Nil => List(Nil) 
    case x :: xs => for { 
     v <- f(xs) 
    } yield List(x) :: v 
    } 

đưa ra thông điệp lỗi

- type mismatch; found : List[List[Any]] required: List[List[Char]] 

Xin hãy giúp tôi hiểu tại sao 'cho' chọn chung nhất Bất kỳ thay vì Char đây? Tôi nên đọc chủ đề nào trong đặc tả ngôn ngữ? Cảm ơn.

Trả lời

10

Kết quả, bạn là yielding là kết hợp của List[List[List[Char]]]List[List[Char]]. Scala upcasts rằng để List[List[Any]]. Đối với trường hợp của bạn, hoặc những điều sau đây sẽ thực hiện công việc:

scala> def f(chars: List[Char]): List[List[Char]] = chars match { 
    |  case Nil => List(Nil) 
    |  case x :: xs => for { 
    |  v <- f(xs) 
    |  } yield x :: v 
    | } 
f: (chars: List[Char])List[List[Char]] 

scala> def f(chars: List[Char]): List[List[Char]] = chars match { 
    |  case Nil => List(Nil) 
    |  case x :: xs => for { 
    |  v <- f(xs) 
    |  } yield List(x) ++ v 
    | } 
f: (chars: List[Char])List[List[Char]] 
6

Vấn đề là List(x) - nó cần phải được x.

Đầu tiên, v lặp lại kết quả của f(xs)f trả lại List[List[Char]]. Điều đó có nghĩa là kết quả sẽ là List[X], trong đó X là loại được trả lại bởi yield.

Loại vList[Char], vì nó đang lặp qua nội dung của f(xs). Vì vậy, chúng tôi phải tìm ra loại List(x) :: v, đang chuẩn bị trước một số List[Char] trên List[Char]. Đó là không phải là ghép nối chúng: nó đang thêm danh sách vào danh sách chứa chỉ các ký tự. Danh sách kết quả sẽ có cả hai số CharList[Char] trong đó.

Vì loại duy nhất thỏa mãn cả hai là Any, sau đó X sẽ là Any và kết quả của sự hiểu biết List[Any].

Các vấn đề liên quan