首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >逃逸效果Monad与不逃逸

逃逸效果Monad与不逃逸
EN

Stack Overflow用户
提问于 2015-12-15 03:49:49
回答 1查看 74关注 0票数 1

这两种功能有什么不同吗?

代码语言:javascript
复制
case class DFStorage(private var cache: Map[String, DataFrame] = Map()) {

  def tryLoad(job: Job): Kleisli[IO, MakeContext, \/[List[String], Unit]] = {
    if(!cache.contains(job.id)) {
      job.tryLoad.map(_.map(df => add(job, df)))
    } else {
      IO(().right[List[String]]).liftKleisli
    }
  }


  def tryLoad(job: Job): Kleisli[IO, MakeContext, \/[List[String], Unit]] = {
    Kleisli({makeContext: MakeContext =>
      if(!cache.contains(job.id)) {
        IO {
          job.tryLoad.run(makeContext).unsafePerformIO().map(df => add(job, df))
        }
      } else {
        IO(().right[List[String]])
      }
    })
  }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-15 04:29:12

我认为您应该将unsafePerformIO称为程序中的最终副作用(例如,在主函数中),但在这种情况下,如果您在IO monad中“解包装”值,然后包装该值的转换,则可能会产生相同的结果。如您所见,这个值的展开和转换可能是与IO.map相同的过程。

unsafePerformIO用于强制执行IO值表示的副作用。在Haskell中,您的程序必须是IO类型,Haskell运行它(main必须具有IO类型)。但是在Scala中,主函数可以执行任何操作,因此必须在此时执行IO。

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

https://stackoverflow.com/questions/34280822

复制
相关文章

相似问题

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