2012-08-04 3 views
13

의 컬렉션을 통해 서열 [숯불]를 받아들이는 기능을 매핑 할 수 없습니다 이유는 Seq[Char]스칼라 : 나는 문자열

def f(s: Seq[Char]) = s 

를 받아들이는 함수를 정의 할 수 있고 나는 String에 전달하면 작동 :

나는 map에서 사용할 수 있다는 것을 의미한다
scala> f("this") 
res8: Seq[Char] = this 

:

scala> List("this").map(s => f(s)) 
res9: List[Seq[Char]] = List(this) 

그래서 내가 왜이 당신이 할 수없는

scala> List("this").map(f) 
<console>:10: error: type mismatch; 
found : Seq[Char] => Seq[Char] 
required: java.lang.String => ? 
       List("this").map(f) 
          ^

답변

11

? : 할 수 없습니다 암시 적 변환 F[A] => F[B]-A => B 전혀 홍보가 없기 때문입니다. 특히 f은 실제로 Seq[Char] => Seq[Char] 유형의 인스턴스이며 암시 적 변환 String => Seq[Char]에서 String => Seq[Char]을 생성해야합니다. Scala는 이와 같은 2 단계 암시 적 변환을 수행하지 않습니다.

당신이 s => f(s)을 작성하는 경우, 스칼라는 sf에 전달되기 전에 Seq[Char]로 변환됩니다 그래서 그 종류의 바이올린 무료입니다.

+1

2 단계 암시 적 변환 제한과 관련이 있다는 느낌이 들었습니다. 설명 주셔서 감사합니다! – dhg

3

아마도이 문제를 해결하는 가장 좋은 방법은 다음과 같습니다 예상대로

def f[S <% Seq[Char]](s: S): S = /* some code */ 

그런 다음, map과 친구가 작동합니다.