2016-08-07 1 views
2

scalacheck로 테스트하고 싶은 개체 목록을 포함하는 불변의 데이터 구조가있는 scala가 있습니다.scalacheck에 foldLeft 또는 foreach가없는 이유 Gen

이 개체의 삽입은 새 개체를 반환합니다. 이 데이터 구조에 여러 객체를 삽입하려면 어떻게합니까? 다시 말해, 데이터 구조의 무작위 인스턴스에 대해 생성기를 작성하려면 어떻게해야합니까? A는 객체의 유형입니다

유형이 H 인 경우

는 [A], 나는 같은 일을 시도 :

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

을하지만이 작동하지 않았다. 의 당신이 WrappedList[String]의 발전기를 정의 할 수있는 방법을 보자,

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) 

} 

간단한 예를 들어 :

+0

임의 [A]는 하나의 생성자를 제공합니다. 실제로는 'Int'를 폴드 할 수 없습니다. 당신은 임의의 [List [A]]를 가질 수 있고, 목록에서 fold를 사용하여 heap을 만들거나 heap = insert (임의의 [A], heap) 또는 empty (pseudo code) –

답변

1

은 여기 insert 작업을 갖춘 아주 간단한, 불변의 데이터 구조입니다.

일 : WrappedList[String] 처음 빈의 각 요소를 삽입하는리스트를 genStrings 의해 생성 된 문자열리스트를 취하고, 주름 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에는 아무런 참고 사항이 없습니다.