2017-02-25 3 views
3

を支えるためにブール値をキャストすることはできません:(47、36)Any => org.scalacheck.P​​ropから利用可能な暗黙的なビューはありません。 ヴァルpropReversed = Prop.forAll {リスト:リスト[INT] =>ScalaCheckは、私は次のプロパティを持つインスタンスに

エラー:(47、36)ではないFORALL方法のための十分な引数:

(暗黙P:任意=> org.scalacheck.P​​rop暗黙的にa1:org.scalacheck.Arbitrary [List [Int]]、暗黙的にs1:org.scalacheck.Shrink [List [Int]]、暗黙的にpp1:List [Int] => org.scalacheck.util.Pretty)org .scalacheck.P​​rop。問題があるということ1.13.4

答えて

4

一覧[INT] =>

私が使用しているScalaCheckバージョン:未指定値パラメータ P、S1、A1 ...

ヴァルpropReversed = Prop.forAll {リスト真の辺のタイプがBoolean、偽の辺のタイプがPropifという表現があります。コンパイラは、Propが必要な場合はブール値に暗黙の変換を適用しますが、このような条件はこれらの場所の1つではありません。代わりにコンパイラはBooleanPropという最小の上限を取り、戻り値の型。 (たぶんもう少し意外にも、これはPropは、第1およびBoolean二が来る場合も同様です)

あなたがこの作品を作ることができるいくつかの方法がありますが、最も簡単なのは、明示的に変換適用するだけです:

val propReversed = Prop.forAll { list: List[Int] => 
    val reversed = list.reverse 

    if (list.isEmpty) Prop.propBoolean(list == reversed) else { 
    val hasSameSize = reversed.size == list.size 
    val hasAllElements = list.forall(reversed.contains) 

    hasSameSize :| " a label which doesn't let the code compile" && 
     hasAllElements && elementsAreReversed(list, reversed) 
    } 
} 

これは、ファンシーな暗黙的な変換でサポートされているDSLの不満のもう一つの例です。私はScalaCheckが好きで、毎日使っていますが、Scalaの(非常に複雑な)構文の他の部分とのやりとりが始まると、トリックが崩壊するときに、少し簡潔な使い方をサポートするためにバックフリップを行う価値はありません。

関連する問題