Dar*_*rio 24 generics functional-programming scala
(如何)以通用方式表示Scala中的monad(如MonadHaskell中的类型类)?是否有可能trait Monad为此目的定义一个?
Dan*_*wak 43
你可以尝试这样的事情:
trait Monad[+M[_]] {
def unit[A](a: A): M[A]
def bind[A, B](m: M[A])(f: A => M[B]): M[B]
}
// probably only works in Scala 2.8
implicit def monadicSyntax[M[_], A](m: M[A])(implicit tc: Monad[M]) = new {
private val bind = tc.bind(m) _
def map[B](f: A => B) = bind(f compose tc.unit)
def flatMap[B](f: A => M[B]) = bind(f)
}
implicit object MonadicOption extends Monad[Option] {
def unit[A](a: A) = Some(a)
def bind[A, B](opt: Option[A])(f: A => Option[B]) = opt flatMap f
}
Run Code Online (Sandbox Code Playgroud)
你当然会为你心中想要的任何其他monad定义类似的隐含对象.在Haskell术语中,您可以将Monad其MonadicOption视为类型类和该类型类的特定实例.在monadicSyntax隐式转换只是演示了如何这种类型类可用于允许使用Scala的的for任何东西满足-comprehensions Monad类型类.
一般来说,Scala标准库中实现的大多数东西flatMap都是monad.Scala没有定义泛型Monad类型类(尽管这非常有用).相反,它依赖于解析器的语法技巧,允许将for-comprehensions与任何实现适当方法的东西一起使用.具体而言,这些方法是map,flatMap和filter(或foreach和filter用于势在必行形式).
| 归档时间: |
|
| 查看次数: |
9086 次 |
| 最近记录: |