[英]Making my own Functor typeclass in Scala
因此,我想創建自己的Functor
來進行類型分類。 但是我遇到了很多問題。 最終目標是能夠說出類似Seq(1,2,3).fmap(2*_)
。
我想出了這個trait
它我所有的谷歌搜索(種)同意:
trait Functor[F[_]] {
def fmap[A, B](r: F[A], f: A => B): F[B]
}
我假設沒有簡單的方法將A
鏈接到F[_]
(即“ F[A]
”)。
但是我在創建隱式連接到Seq
遇到了嚴重的麻煩。 這是一個嘗試:
implicit class SeqFunctorOps[A](xs: Seq[A]) {
def fmap[B](f: A => B) = xs map f
}
但這不適合我的Functor
,所以讓我們擴展一下:
implicit class SeqFunctorOps[A](xs: Seq[A]) extends Functor[Seq] {
def fmap[A, B](f: A => B) = xs map f
}
但這不起作用,因為在fmap[A, B]...
, A
是新的泛型類型,並且不與xs: Seq[A]
綁定xs: Seq[A]
。
有沒有辦法將他們綁在一起?
但是,在我看來,考慮其他在線資源已指出要使用同伴對象, implicit class
並不是走的路,但是我似乎無法使其工作。
object Functor {
implicit def SeqFunctor: Functor[Seq] = new Functor[Seq] {
def fmap[A, B](r: Seq[A], f: A => B) = r map f
}
}
implicit class SeqFunctorOps[A](xs: Seq[A])(implicit F: Functor[Seq]) {
def fmap[B](f: A => B) = F.fmap(xs, f)
}
這種方法似乎可行,但是看起來很不合理。
嘗試執行此類操作時,是否可以使用一般模式?
榮耀歸於@drexin,這似乎足夠好:
trait Functor[F[_]] {
def fmap[A, B](r: F[A], f: A => B): F[B]
}
object Functor {
implicit def SeqFunctor: Functor[Seq] = new Functor[Seq] {
def fmap[A, B](r: Seq[A], f: A => B) = r map f
}
implicit class Ops[A, F[_]: Functor](xs: F[A]) {
def fmap[B](f: A => B) = implicitly[Functor[F]].fmap(xs, f)
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.