我正在使用cats-effect 0.10.1,发现Bracket
此版本中没有类型类。所以这似乎我需要为此引入一些解决方法。
我正在设计从某个来源(副作用)读取的功能。所以我有 \
trait DataFormat
object StreamData{
def apply[T](path: String)(f: (DataFormat, ReadableByteChannel) => T): IO[T] =
IO {
val channel: ReadableByteChannel = Files.newByteChannel(path)
try{
val dataFormat: DataFormat = //...
//in case of GZIP format open GZIPInputStream
f(dataFormat, channel)
} finally {
if(channel != null) channel.close()
}
}
}
这个问题f: (DataFormat, ReadableByteChannel) => T
是不纯的。因此,我将使其f: (DataFormat, ReadableByteChannel) => IO[T]
无法在上面的示例中释放资源(因为flatMap
在这种情况下我需要这样做)。
您能否提出任何解决方法并保持功能纯净?