在scala中编写自定义monad时使用过滤器实现

在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:

我无法实现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: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
进行
模式匹配,对
中得到的值进行匹配