Scala 多泛型参数数据结构类型类实例
Scala multiple generic parameter data structure typeclass instance
我正在使用 Scalaz,因为我喜欢标准库中 Haskell 类型 class 设置的很多方面。但这正是我目前的问题。我有一个带有两个通用参数的通用数据结构:
case class Parser[T,A](f: T => (T,A))
在 Haskell 中,我会像这样实现 Alternative
类型 class:
newtype Parser t a = Parser { runParser :: t -> (t,a) }
instance Alternative (Parser t) where
...
但是我怎样才能在 Scala 中做同样的事情呢?据我所知我不能做类似
的事情
object Parser {
implicit def ins_Alternative[T] = new Alternative[Parser[T]] {
// ...
}
}
有人知道怎么做吗?提前致谢!
更新:
我找到了这个:
implicit def eitherMonad[L]: Traverse[Either[L, ?]] with MonadError[Either[L, ?], L] with BindRec[Either[L, ?]] with Cozip[Either[L, ?]] =
new Traverse[Either[L, ?]] with MonadError[Either[L, ?], L] with BindRec[Either[L, ?]] with Cozip[Either[L, ?]] {
def bind[A, B](fa: Either[L, A])(f: A => Either[L, B]) = fa match {
case Left(a) => Left(a)
case Right(b) => f(b)
}
// ...
}
在 Scalaz 来源中 (https://github.com/scalaz/scalaz/blob/series/7.3.x/core/src/main/scala/scalaz/std/Either.scala)。
根据这个我想我必须写一些类似
的东西
object Parser {
implicit def ins_Alternative[T] = new Alternative[Parser[T, ?]] {
// ...
}
}
无法编译,因为类型 ?
未知。
我找到了解决办法。
implicit def ins_Alternative[T] = new Alternative[({type x[a] = Parser[T, a]})#x] {
override def empty[A]: Parser[T, A] = ???
override def plus[A](a: Parser[T, A], b: => Parser[T, A]): Parser[T, A] = ???
override def point[A](a: => A): Parser[T, A] = ???
override def ap[A, B](fa: => Parser[T, A])(f: => Parser[T, (A) => B]): Parser[T, B] = ???
}
我正在使用 Scalaz,因为我喜欢标准库中 Haskell 类型 class 设置的很多方面。但这正是我目前的问题。我有一个带有两个通用参数的通用数据结构:
case class Parser[T,A](f: T => (T,A))
在 Haskell 中,我会像这样实现 Alternative
类型 class:
newtype Parser t a = Parser { runParser :: t -> (t,a) }
instance Alternative (Parser t) where
...
但是我怎样才能在 Scala 中做同样的事情呢?据我所知我不能做类似
的事情object Parser {
implicit def ins_Alternative[T] = new Alternative[Parser[T]] {
// ...
}
}
有人知道怎么做吗?提前致谢!
更新:
我找到了这个:
implicit def eitherMonad[L]: Traverse[Either[L, ?]] with MonadError[Either[L, ?], L] with BindRec[Either[L, ?]] with Cozip[Either[L, ?]] =
new Traverse[Either[L, ?]] with MonadError[Either[L, ?], L] with BindRec[Either[L, ?]] with Cozip[Either[L, ?]] {
def bind[A, B](fa: Either[L, A])(f: A => Either[L, B]) = fa match {
case Left(a) => Left(a)
case Right(b) => f(b)
}
// ...
}
在 Scalaz 来源中 (https://github.com/scalaz/scalaz/blob/series/7.3.x/core/src/main/scala/scalaz/std/Either.scala)。
根据这个我想我必须写一些类似
的东西object Parser {
implicit def ins_Alternative[T] = new Alternative[Parser[T, ?]] {
// ...
}
}
无法编译,因为类型 ?
未知。
我找到了解决办法。
implicit def ins_Alternative[T] = new Alternative[({type x[a] = Parser[T, a]})#x] {
override def empty[A]: Parser[T, A] = ???
override def plus[A](a: Parser[T, A], b: => Parser[T, A]): Parser[T, A] = ???
override def point[A](a: => A): Parser[T, A] = ???
override def ap[A, B](fa: => Parser[T, A])(f: => Parser[T, (A) => B]): Parser[T, B] = ???
}