6

Scalaコンパイラがこの関数定義に不満を持っている理由を理解するのに苦労しています。

def trimNonWordCharacters[T <: Iterable[String]](items: T): T =
     items map { _.replaceAll("\\W", "") }

REPL出力は次のとおりです。

scala> def trimNonWordCharacters[T <: Iterable[String]](items: T): T =
     items map { _.replaceAll("\\W", "") }
<console>:5: error: type mismatch;
 found   : Iterable[java.lang.String]
 required: T
       def trimNonWordCharacters[T <: Iterable[String]](items: T): T = items map { _.replaceAll("\\W", "") }

目標は、Iterableの実装を渡し、同じタイプのバックアウトを取得することです。これは可能ですか?

4

2 に答える 2

14

mapメソッドは をIterable返すため、が のサブクラスであっIterableても、そのメソッドは を返します。TIterablemapIterable

タイピングを改善するには、次のように記述する必要があります。

import scala.collection.IterableLike
def trimNonWordCharacters[T <: Iterable[String]](items: T with IterableLike[String, T]): T =
     items map { _.replaceAll("\\W", "") }

Tただし、マップが別のマップを生成するための情報がないため、これも機能しませんT。たとえば、 を にマッピングしBitSetても、 にStringはなりませんBitSet。したがって、別の何かが必要です:マッピングされた要素が型であるaTから aを構築する方法を教える何かです。このような:TString

import scala.collection.IterableLike
import scala.collection.generic.CanBuildFrom
def trimNonWordCharacters[T <: Iterable[String]]
                         (items: T with IterableLike[String, T])
                         (implicit cbf: CanBuildFrom[T, String, T]): T =
     items map { _.replaceAll("\\W", "") }
于 2012-04-04T21:52:33.087 に答える
0

[コメント内のコードが適切にフォーマットされていないため、コメントではなく回答として入力]

@Daniel、説明をありがとう、私もそれが役に立ちました。Iterable は IterableLike から派生するため、以下も機能するようで、わずかにコンパクトです。

import scala.collection.IterableLike
import scala.collection.generic.CanBuildFrom
def trimNonWordCharacters[T <: IterableLike[String, T]]
 (items: T)
 (implicit cbf: CanBuildFrom[T, String, T]): T =
 items map { _.replaceAll("\\W", "") }
于 2012-08-31T13:58:38.260 に答える