gpt4 book ai didi

scala - 如何将函数的返回类型指定为(任意)monad?

转载 作者:行者123 更新时间:2023-12-04 18:15:12 26 4
gpt4 key购买 nike

简而言之,我想声明一个这样的特征:

trait Test {
def test(amount: Int): A[Int] // where A must be a Monad
}

这样我就可以在不知道 A 的 monad 的情况下使用它就好像:
class Usecase {
def someFun(t: Test) = for { i <- t.test(3) } yield i+1
}

更多细节...

本质上,我想做这样的事情:
class MonadResultA extends SomeUnknownType {
// the base function
def test(s: String): Option[Int] = Some(3)
}

class MonadResultB(a: MonadResultA) extends SomeUnknownType {
// added a layer of Writer on top of base function
def test(s: String): WriterT[Option, String, Int] = WriterT.put(a.test(s))("the log")
}

class Process {
def work(x: SomeUnknownType) {
for {
i <- x.test("key")
} yield i+1
}
}

我希望能够传递 MonadResultA 的任何实例 MonadResultB无需对函数 work 进行任何更改.
缺少的部分是 SomeUnknowType ,我猜应该有 test像下面这样制作 work函数编译。
trait SomeUnknowType {
def test(s: String): T[Int] // where T must be some Monad
}

正如我所说,我还在学习这个 monad 的东西......如果你发现我的代码不是正确的方法,非常欢迎你指出来~

非常感谢~~

最佳答案

假设您有一个名为 Monad 的类型类你可以写

def test[A:Monad](amount: Int): A[Int]

编译器将要求存在 Monad[A] 类型的隐式调用测试时在范围内。

编辑:
我仍然不确定您在寻找什么,但是您可以将 monad 值与其对应的类型类打包成这样的特征:
//trait that holds value and monad
trait ValueWithMonad[E] {
type A[+E]
type M <: Monad[A]
val v:A[E]
val m:M
}

object M {

//example implementation of test method
def test(amount:Int):ValueWithMonad[Int] = new ValueWithMonad[Int] {
type A[+E] = Option[E]
type M = Monad[Option]
override val v = Option(amount)
override val m = OptionMonad
}

//test can now be used like this
def t {
val vwm = test(1)
vwm.m.bind(vwm.v, (x:Int) => {
println(x)
vwm.m.ret(x)
})
}
}

trait Monad[A[_]] {
def bind[E,E2](m:A[E], f:E=>A[E2]):A[E2]
def ret[E](e:E):A[E]
}

object OptionMonad extends Monad[Option] {
override def bind[E,E2](m:Option[E], f:E=>Option[E2]) = m.flatMap(f)
override def ret[E](e:E) = Some(e)
}

关于scala - 如何将函数的返回类型指定为(任意)monad?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11883581/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com