簡體   English   中英

在Scala中創建自己的Functor類型類

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM