2017-05-18 4 views
1

Scalazは、下記のfor comprehensionにv1_bの型注釈を与えると、Monoidインスタンスが必要です。型の注釈がcomprehensinのために与えられている場合、scalazのdisjuntionはエラーを返します

1)なぜですか?

2)このエラーにはfilterも含まれています。filterはこの写真にどのように含まれていますか?

import scalaz._ 
import Scalaz._ 

case class MyError(s:String) 

type Err=MyError 
val v1: \/[Err, String] = "cool".right 
val v2: \/[Err, String] = MyError("not cool").left[String] 

val res: \/[Err, (String,String)] =for { 
    v1_a <- v1 // this works fine 

    // v1_b : String <- v1 
    // uncommenting the line above gives the following compiler error: 
    // Error:(23, 22) could not find implicit value for parameter M: scalaz.Monoid[_experiment.scalaz.Disjunction.Err] 
    // Error:(23, 22) not enough arguments for method filter: (implicit M: scalaz.Monoid[_experiment.scalaz.Disjunction.Err])scalaz.\/[_experiment.scalaz.Disjunction.Err,String]. 
    // Unspecified value parameter M. 

    v2_ <- v2 
} yield (v1_a,v2_) 

println(res) 

はこのフィドルにオンラインこのコードを試してみてください。https://scalafiddle.io/sf/DHO6xki/3

答えて

4

v1_b : Stringは、実行時に型テストを実行します。したがって、このforの解説にはfilterが含まれています(テストが失敗した場合を除外するため)。 filter on \/は、左側がモノイドであることが必要です。

+0

興味深い!ありがとう! – jhegedus

関連する問題