首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Scalaz作家Monad和filterM

Scalaz作家Monad和filterM
EN

Stack Overflow用户
提问于 2015-09-21 10:23:40
回答 1查看 206关注 0票数 0

我正在学习学习黄曲柳给你一个更好的哈斯克尔,并想知道如何将filterM示例从LYAHFGG转换到Scala。

fst $ runWriter $ filterM keepSmall [9,1,5,2,10,3]

keepSmall定义为

代码语言:javascript
复制
keepSmall :: Int -> Writer [String] Bool  
keepSmall x  
    | x < 4 = do  
        tell ["Keeping " ++ show x]  
        return True  
    | otherwise = do  
        tell [show x ++ " is too large, throwing it away"]  
        return False

我天真的方法以编译错误结束,我不知道如何解决这个问题!

代码语言:javascript
复制
    val keepSmall: (Int => WriterT[Id, Vector[String], Boolean]) = (x: Int) => 
      if (x < 4) for {
        _ <- Vector("Keeping " + x.shows).tell
      } yield true
      else for {
        _ <- Vector(x.shows + " is too large, throwing it away").tell
      } yield false

println(List(9,1,5,2,10,3) filterM keepSmall)

编译错误:

代码语言:javascript
复制
 Error:(182, 32) no type parameters for method filterM: (p: Int => M[Boolean])(implicit evidence$4: scalaz.Applicative[M])M[List[Int]] exist so that it can be applied to arguments (Int => scalaz.WriterT[scalaz.Scalaz.Id,Vector[String],Boolean])
 --- because ---
argument expression's type is not compatible with formal parameter type;
 found   : Int => scalaz.WriterT[scalaz.Scalaz.Id,Vector[String],Boolean]
 required: Int => ?M[Boolean]
    println(List(9,1,5,2,10,3) filterM keepSmall)
                               ^

代码语言:javascript
复制
Error:(182, 40) type mismatch;
 found   : Int => scalaz.WriterT[scalaz.Scalaz.Id,Vector[String],Boolean]
 required: Int => M[Boolean]
    println(List(9,1,5,2,10,3) filterM keepSmall)
                                       ^
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-21 10:39:58

这个问题是因为Scala不能真正知道如何在filterM所期望的参数中加入一个有三个洞的类型,这个参数只有一个填充了Boolean的洞。

您可以使用这样的奇怪类型-lambda语法来解决您的问题(没有测试,可能不起作用):

代码语言:javascript
复制
val keepSmall: (Int => ({type L[T] = WriterT[Id, Vector[String], T]})#L) = ...

或者(更容易)引入一个类型别名,如下所示:

代码语言:javascript
复制
type MyWriter[T] = WriterT[Id, Vector[String], T]
val keepSmall: (Int => MyWriter[Boolean]) = ...

这将确保filterM所期望的参数类型与所提供的参数类型相匹配。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32692819

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档