2016-08-07 13 views
2

私はscalacheckでテストしたいオブジェクトのリストを含む、scalaの不変なデータ構造を持っています。scalacheckにfoldLeftやforeachがないのはなぜですか?

このオブジェクトの挿入により、新しいオブジェクトが返されます。このデータ構造に複数のオブジェクトを挿入するにはどうすればよいですか?言い換えれば、私のデータ構造のランダムインスタンスのためにジェネレータを書くにはどうしたらいいですか?

型はAがオブジェクトのタイプであるH [A]である場合は、私が何かやってみました:

var heap = empty 
arbitrary[A] map (x => heap = insert(x, heap)) 

をが、これは動作しませんでした。ここで

+0

任意[A]はあなたに1つのことのジェネレータを与え、あなたは本当に 'Int'を折りたたむことはできません。あなたは '任意の[List [A]]'を持っていて、リスト上のfoldを使ってヒープを作成したり、ヒープを(擬似コード) 'heap = insert(任意の[A]、ヒープ) –

答えて

1

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は必要ありません。

関連する問題