这两种功能有什么不同吗?
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]])
}
})
}
}发布于 2015-12-15 04:29:12
我认为您应该将unsafePerformIO称为程序中的最终副作用(例如,在主函数中),但在这种情况下,如果您在IO monad中“解包装”值,然后包装该值的转换,则可能会产生相同的结果。如您所见,这个值的展开和转换可能是与IO.map相同的过程。
unsafePerformIO用于强制执行IO值表示的副作用。在Haskell中,您的程序必须是IO类型,Haskell运行它(main必须具有IO类型)。但是在Scala中,主函数可以执行任何操作,因此必须在此时执行IO。
https://stackoverflow.com/questions/34280822
复制相似问题