在scala中编写自定义monad时使用过滤器实现
我无法实现monad来编写函数。它在理解“value withFilter不是MonadFunctionComposition.Writer的成员”时抛出了一个错误在scala中编写自定义monad时使用过滤器实现,scala,Scala,我无法实现monad来编写函数。它在理解“value withFilter不是MonadFunctionComposition.Writer的成员”时抛出了一个错误 对象MonadFunctionComposition扩展应用程序{ 案例类编写器(value1:Int、value2:Int、logs:String){ 定义映射(x:(Int,Int)=>Int):编写器={ 写入程序(x(值1,值2),x(值1,值2),日志) } def flatMap(x:(Int,Int)=>Writer:
对象MonadFunctionComposition扩展应用程序{
案例类编写器(value1:Int、value2:Int、logs:String){
定义映射(x:(Int,Int)=>Int):编写器={
写入程序(x(值1,值2),x(值1,值2),日志)
}
def flatMap(x:(Int,Int)=>Writer:Writer={
val temp=x(值1,值2)
val temp1=x(值2,值2)
写入程序(临时值1、临时值1.2、日志+“…”+临时日志)
}
}
valf:(Int,Int)=>Writer=(value1,value2)=>{
编写器(value1+57,value2-2,s“使用$value1$value2值执行函数f”)
}
val g:(Int,Int)=>Writer=(value1,value2)=>{
编写器(value1+10,value2-1,s“使用$value1$value2值执行函数g”)
}
val结果=用于
{
(a,x)在这种情况下,不要认为有一个有用的with filter
实现是可能的
您的编写器不是单子。
首先,单子必须是泛型的(Writer[T]
)
其次,map
和flatMap
必须有正确的签名:
def map[B](f: T => B): Writer[B]
def flatMap[B](f: T => Writer[B]): Writer[B]
令人惊讶的是,编译器没有在您的案例中抛出错误
然后,您可以考虑使用filter添加,
方法:
def withFilter(p:T=>Boolean):Writer[T]
但它应该做什么呢
当然有一个简单的实现,它什么也不做,只返回this
。
如果p(this)
为false
,也可以丢弃日志,但这不是人们所期望的
对一元值进行过滤的能力编码在MonadPlus
typeclass中。Scalaz/Cats和Haskell都没有为Writer
实现MonadPlus
,不要认为在这种情况下有一个有用的with filter
实现是可能的
您的编写器不是单子。
首先,单子必须是泛型的(Writer[T]
)
其次,map
和flatMap
必须有正确的签名:
def map[B](f: T => B): Writer[B]
def flatMap[B](f: T => Writer[B]): Writer[B]
令人惊讶的是,编译器没有在您的案例中抛出错误
然后,您可以考虑使用filter添加,
方法:
def withFilter(p:T=>Boolean):Writer[T]
但它应该做什么呢
当然有一个简单的实现,它什么也不做,只返回this
。
如果p(this)
为false
,也可以丢弃日志,但这不是人们所期望的
对一元值进行过滤的能力编码在MonadPlus
typeclass中。Scalaz/Cats和Haskell都没有为Writer
实现MonadPlus
使用中的自定义单子进行理解
需要使用过滤函数实现签名:def with filter(p:T=>Boolean):Writer[T]
。尝试将函数添加到monad。@BorisAzanov withFilter的实现应该是什么?@abhi essential这是一种懒惰的过滤器
-就像你正在应用过滤器一样,它将在终端操作期间采取行动。例如列表
-像串、折叠等方法。@IvanKurchenko应该是withFilter的实现?我无法执行代码。@IvanKurchenko这取决于您的Monad实现。一般来说:如果Monad中的值不满足谓词,您应该返回到error
或empty
value。顺便说一句,看看您的代码-它不是真正的Monad,它只是一个用于理解的方法
。在中使用自定义单子进行理解
需要withFilter函数实现签名:def withFilter(p:T=>Boolean):Writer[T]
。尝试将函数添加到monad。@BorisAzanov withFilter的实现应该是什么?@abhi essential这是一种懒惰的过滤器
-就像你正在应用过滤器一样,它将在终端操作期间采取行动。例如列表
-像串、折叠等方法。@IvanKurchenko应该是withFilter的实现?我无法执行代码。@IvanKurchenko这取决于您的Monad实现。一般来说:如果Monad中的值不满足谓词,您应该返回到error
或empty
value。顺便说一句,看看您的代码-它不是真正的Monad,它只是一个描述用于理解的方法。那么在上述情况下如何组合用于理解的函数f和g?您可以补充到这个答案,如果您添加了,那么代码将编译,而无需使用过滤器实现愚蠢的。
@LuisMiguelMejíaSuárez似乎我搞错了问题。我认为at OP实际上想在中使用if
进行模式匹配,对从中获得的值进行匹配,那么在上述情况下,如何组合函数f和g用于理解?您可以在回答中补充一点,如果添加íaSuárez似乎我把问题搞错了。我认为OP实际上想在中使用if
进行模式匹配,对中得到的值进行匹配