2010-04-21 50 views
2

下編譯:編譯問題使用上設置scalaz的MA的方法,但只是罰款使用斯卡拉的Beta1和scalaz快照5.0沒有列出

val p1: Int => Boolean = (i : Int) => i > 4 

val s: List[Int] = List(1, 2, 3) 
val b1 = s ∃ p1 

然而,這並不:

val s: Set[Int] = Set(1, 2, 3) 
val b1 = s ∃ p1 

我得到的以下錯誤:

Found: Int => Boolean
Required: Boolean => Boolean

方法的簽名是:

def ∃(p: A => Boolean)(implicit r: FoldRight[M]): Boolean = any(p) 

而且在範圍內應該有一個隱含的SetFoldRight。方法完全一樣:,∈: - 發生了什麼?

回答

3

看起來MA[M[_],A]中的A對於SetBoolean。在Scalazobject,存在以下隱:

implicit def Function1ApplyMA[A, R](f: A => R): MA[PartialApply1Of2[Function1, A]#Apply, R] = ma[PartialApply1Of2[Function1, A]#Apply, R](f) 

現在我還不完全明白這是怎麼回事這裏的類型,但它看起來像在MA[M[_],A]AFunction1的返回類型。 Set[A]延伸A => Boolean,因此的定義中的A被推斷爲Boolean

一個解決方法是使用顯式ma方法來設置轉換成MA,而不是讓implicits做繁重:

val s = ma(Set(1, 2, 3)) 
+0

我明白了 - 我知道這與Set擴展'A => Boolean'的事實有關。你指定的隱式從'Function' [I,R]'創建一個'MA [M [_],A]'。 'M [_]'被推斷爲'PartialApply1Of2',它使得MA的第二個參數爲'R'。在這種情況下,'R'當然是'布爾'的'Function1'的返回類型。 – 2010-04-21 14:28:47

3

我需要把它添加到object Scalaz

implicit def SetMA[M[_] <: Set[_], A](s: M[A]): MA[M, A] = ma[M, A](s) 

但是,感謝#2741,我遇到了一個問題,使得這個優先級高於違規轉換:

implicit def Function1ApplyMA[A, R](f: A => R): MA[PartialApply1Of2[Function1, A]#Apply, R] = ma[PartialApply1Of2[Function1, A]#Apply, R](f) 

我真的希望SeqSet可以隱式轉換爲Function1而不是繼承它。

UPDATE

這是現在fixed

+0

我認爲還應該爲成員方法提供一個「更乾淨」的基於集合的實現 - 即它們不使用「FoldRight」,而是使用「Set」是「A => Boolean」的事實。不是我有任何想法如何做到這一點:-) – 2010-04-21 22:38:23