2017-08-15 8 views
4

私はscalazの| @ |を使用できるようにしたいと思います。私自身の応用ファンクタで。scalazで使用するカスタムApplicative Functorを作成するにはどのような方法が必要ですか?

例:
val spread: Source[Yield] = (y2 |@| y1)(_ - _)

これは、私はそれがファンクタですので、私はmapを実装する必要が確信している

sealed abstract class Source[+A] { 
    def map[B](f: A => B): Source[B] 
    def unit[A](a: A): Source[A] 
    def pureList[A](la: List[A]): Source[A] 
    def zero[A]: Source[A] 
    def map2[A, B, C](as: Source[A], bs: Source[B], f: (A, B) => C): Source[C] 
} 

私のクラスです。
アプリケーションは、さまざまな方法で実装できます。たとえば、apply()およびunit()またはおよびunit()を使用して実装できます。

appureも必要ですか?

ご覧のとおり、何が必要なのか分かりません。

+0

注意ご例えばあなたが唯一の '' Apply'ないApplicative'が必要であること。 –

+0

@ LukaJacobowitz私は分かりません。メソッド 'apply'は必要ないのですか?' applyative'メソッドが必要ですか?それとも、私はそれをApplicativeファンクタの代わりにApplyファンクタと呼ぶべきであることを意味しますか? – Adrian

答えて

6
implicit val mya = new Applicative[Source] {} 

コンパイラはあなたのためにその質問に答えるみましょう:

object creation impossible, since: 
it has 2 unimplemented members. 
/** As seen from <$anon: scalaz.Applicative[Source]>, the missing signatures are as follows. 
* For convenience, these are usable as stub implementations. 
*/ 
    // Members declared in scalaz.Applicative 
    def point[A](a: => A): Source[A] = ??? 

    // Members declared in scalaz.Apply 
    def ap[A, B](fa: => Source[A])(f: => Source[A => B]): Source[B] = ??? 
+0

それは私が気づいていない素敵なトリックです!ありがとう – Adrian

関連する問題