我正在使用cat-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
)。
你能否提出一些关于它的解决方法,同时保持功能纯净?