がinsert
操作を装備した非常にシンプルな、不変のデータ構造である:簡単な例として
final class WrappedList[A] private (underlying: List[A]) {
def insert[B>:A](elem: B): WrappedList[B] = new WrappedList(elem :: underlying)
override def toString: String = "WrappedList(" + underlying.mkString(", ") + ")"
}
object WrappedList {
def empty[A]: WrappedList[A] = new WrappedList(Nil)
}
、あなたがWrappedList[String]
の発電機を定義することができるか見てみましょう。 genStrings
によって生成された文字列のリストを取得し、最初は空WrappedList[String]
の各要素を挿入するために、そのリストの上に折り畳まWrappedList[String]
の発生を定義し、そして
val genStrings: Gen[List[String]] =
Gen.listOfN[String](10, Gen.oneOf("foo", "bar", "baz", "qux", "quux"))
:まず、List[String]
用ジェネレータを定義
val genWrappedListOfStrings = genStrings
.flatMap { _.foldRight(WrappedList.empty[String]) { (string, wrappedList) =>
wrappedList insert string }}
完了です!
var
は必要ありません。
任意[A]はあなたに1つのことのジェネレータを与え、あなたは本当に 'Int'を折りたたむことはできません。あなたは '任意の[List [A]]'を持っていて、リスト上のfoldを使ってヒープを作成したり、ヒープを(擬似コード) 'heap = insert(任意の[A]、ヒープ) –