小编cwm*_*ers的帖子

如何避免在Scala中使用Monad变形金刚踩踏板?

我有以下代码使用Readermonad进行配置,还必须处理,IO[Option[String]]我最终得到的代码是我的encode函数中的阶梯.

我怎样才能为我的函数中的monad变换器制定ReaderOptionT避免丑陋的嵌套for理解encode

def encode(fileName: String): Reader[Config, IO[Unit]] = for {
   ffmpegWrapper <- findFfmpegWrapper
   ffmpegBin <- findFfmpeg
} yield (for {
    w <- ffmpegWrapper
    b <- ffmpegBin
    stream <- callFfmpeg(getCommand(w, b, fileName)).liftM[OptionT]
} yield stream) map (_ foreach (println)) getOrElse Unit.box {}


def getCommand(ffmpegWrapper: String, ffmpegBin: String,
             videoFile: String) = s"$ffmpegWrapper $ffmpegBin $videoFile  '-vcodec libx264 -s 1024x576' /tmp/out.mp4"

def callFfmpeg(command: String): IO[Stream[String]] = IO {
  Process(command).lines_!
} …
Run Code Online (Sandbox Code Playgroud)

scala monad-transformers scalaz reader-monad

11
推荐指数
1
解决办法
1267
查看次数

如何在scalaz 7中使用变换器在monad堆栈之间进行转换

我正在努力理解monad堆栈和monad变换器Scalaz7.我觉得我非常接近答案,但却无法理解我的特定步骤.

以下代码在磁盘上查找ffmpeg二进制文件,然后创建要运行的可执行命令,然后执行该命令,然后对输出执行一些微不足道的操作.

object Encoder {

  def findFfmpeg: OptionT[IO, String] = {
    OptionT[IO, String](IO {
      List("/usr/local/bin/ffmpeg", "/usr/bin/ffmpeg").find {
        new File(_).exists
      }
    }
    )
  }

  def getCommand(ffmpegBin: String,
                 videoFile: String) = s"$ffmpegBin $videoFile  '-vcodec libx264 -s 1024x576' /tmp/out.mp4"

  def callFfmpeg(command: String): IO[Option[Stream[String]]] = IO {
    Some(Process(command).lines_!)
  }

  def getStream(fileName: String): OptionT[IO, Stream[String]] = {
    val optionalCommand: OptionT[IO, String] = findFfmpeg map {
      getCommand(_, fileName)
    }
    optionalCommand >>= {
      command => OptionT[IO, Stream[String]](callFfmpeg(command))
    }
  }

  def encode(fileName: String): IO[Unit] …
Run Code Online (Sandbox Code Playgroud)

scala monad-transformers scalaz scalaz7

6
推荐指数
1
解决办法
405
查看次数