Scala 对猫的状态单体进行测序

Scala 对猫的状态单体进行测序,scala,state-monad,scala-cats,Scala,State Monad,Scala Cats,我刚刚查看了scala的猫图书馆,更具体地说是州立单子 作为一个玩具示例,我想创建一些逻辑来拆分一个可能较大的字符串(StringBuilder),并返回拆分后的字符串和剩余的StringBuilder: 对象拆分器{ def apply(maxSize:Int,overlap:Int):状态[StringBuilder,String]=状态( 生成器=>{ val splitPoint=math.min(builder.size,maxSize+overlap) (builder.drop(m

我刚刚查看了scala的猫图书馆,更具体地说是州立单子

作为一个玩具示例,我想创建一些逻辑来拆分一个可能较大的字符串(StringBuilder),并返回拆分后的字符串和剩余的StringBuilder:

对象拆分器{
def apply(maxSize:Int,overlap:Int):状态[StringBuilder,String]=状态(
生成器=>{
val splitPoint=math.min(builder.size,maxSize+overlap)
(builder.drop(maxSize),builder.substring(0,splitPoint))
}
)
}
运行State monad的一个步骤可以很好地工作,但我希望链接所有步骤,直到StringBuilder最终为空:

val stop=State.inspect((s:StringBuilder)=>s.isEmpty)
拆分器(3,2).untilM[Vector](停止).run(新StringBuilder(“tarsntiars”))
然而,这不起作用,因为untilM是Monad trait的成员,并且范围中没有隐式转换。有效的方法是:

val monad=StateT.catsDataMonadForStateT[Eval,StringBuilder]
monad.untilM[List,String](拆分器(3,2))(stop.run(新的StringBuilder(“tarsntiars”))

然而,我认为较短的更具可读性,所以我想知道为什么它不起作用?为什么通常的MonadOps机制在这里不起作用?

在SI-2712被修复后,
取消应用
解决方法从Cats中删除:。现在您需要
-Ypartial unification
编译器标志(假设您使用的是Scala 2.11或2.12),以便将
状态
视为
Monad


Scalaz仍然有
Unapply
机制,因此您的代码应该在没有编译器标志的情况下使用Scalaz。

什么是“停止”?我添加了停止的定义。谢谢您的回答。由于这是公认的答案,我想补充一点,这打破了IntelliJ IDEA中的语法突出显示。他们意识到了这一点,并将通过以下方式进行修复:值得注意的是,如果您使用的是2.11.9之前的Scala 2.11版本,甚至是Scala 2.10,那么您仍然可以使用此sbt插件来启用部分统一修复:(另外,如果您使用的是受支持的版本,插件将只启用标志)