3

私は次のおもちゃの機能を持っています:

def test[T](x: Option[List[Option[T]]])
{
    for (a <- x; b <- a; c <- b) println(c)
    println("----------")
}

Option[Option[Option[T]]]上記の関数を一般化して、またはList[List[List[T]]]またはその他のとの組み合わせでOptionも機能するようにするにはどうすればよいListですか?

型は型構築子ではないため、次の試みは明らかに機能しません。

def test2[Q,R,S,T](x: Q[R[S[T]]])

C ++では、おそらくこの目的のためにテンプレートテンプレートを使用します。Scalaにはそのようなものがありますか?

4

2 に答える 2

4

Scalazを使用できますか?もしそうなら、これはEach型クラスでかなり簡単です:

import scalaz._, Scalaz._

def test[Q[_]: Each, R[_]: Each, S[_]: Each, T](x: Q[R[S[T]]]) {
  for (a <- x; b <- a; c <- b) println(c)
  println("----------")
}
于 2012-04-11T14:28:24.630 に答える
1

OptionとListはそれぞれ、forループで使用されるforeachメソッドを実装しますが、共通のスーパータイプはありません。ただし、構造型は、必要なメソッドを型として宣言することで可能になります。

type E[V] = {def foreach[U](f: (V) => U)}
def test2[Q[R] <: E[R],R[S] <: E[S],S[T] <: E[T],T](x: Q[R[S[T]]]) {
  for (a <- x; b <- a; c <- b) println(c)
  println("----------")
}

例:

scala> test2(List(List(List(8))))
8

scala> test2(Some(List(Some(8))))
8

forループをyieldを使用するように変更する場合は、Eを変更して、foreachではなくflatmapおよびmap-methodsを実装する必要があります。

于 2012-04-11T14:37:47.987 に答える