Sml 以标准ML格式将TextIO流转换为BinIO流
在标准ML中,我有一个函数,可以写入Sml 以标准ML格式将TextIO流转换为BinIO流,sml,Sml,在标准ML中,我有一个函数,可以写入BinIO.outstream,我希望它写入标准输出 当TextIO结构具有TextIO.outstream类型的stdOut时,BinIO没有这样的变量,TexIO.outstream与BinIO.outstream不兼容: - f; val it = fn : BinIO.outstream -> unit - TextIO.stdOut; val it = - : TextIO.outstream - f TextIO.stdOut; stdIn:
BinIO.outstream
,我希望它写入标准输出
当TextIO
结构具有TextIO.outstream
类型的stdOut
时,BinIO
没有这样的变量,TexIO.outstream
与BinIO.outstream
不兼容:
- f;
val it = fn : BinIO.outstream -> unit
- TextIO.stdOut;
val it = - : TextIO.outstream
- f TextIO.stdOut;
stdIn:6.1-6.16 Error: operator and operand don't agree [tycon mismatch]
operator domain: BinIO.outstream
operand: TextIO.outstream
in expression:
f TextIO.stdOut
现在,将TextIO.outstream
转换为BinIO.outstream
的最简单方法是什么?i、 e.如何实施下面的?
- f (??? TextIO.stdOut);
更新:
对于感兴趣的人,以下是根据Andreas的回答实施的:
fun textWriterToBinWriter (TextPrimIO.WR { name,
chunkSize,
writeVec,
writeArr,
writeVecNB,
writeArrNB,
block,
canOutput,
getPos,
setPos,
endPos,
verifyPos,
close,
ioDesc }) =
let
fun convertWriteVec textWriteVec =
textWriteVec o CharVectorSlice.full o Byte.unpackStringVec
fun convertWriteArr textWriteArr =
textWriteArr o CharArraySlice.full o CharArray.fromList o explode o Byte.unpackString
in
BinPrimIO.WR {
name = name,
chunkSize = chunkSize,
writeVec = Option.map convertWriteVec writeVec,
writeArr = Option.map convertWriteArr writeArr,
writeVecNB = Option.map convertWriteVec writeVecNB,
writeArrNB = Option.map convertWriteArr writeArrNB,
block = block,
canOutput = canOutput,
getPos = getPos,
setPos = setPos,
endPos = endPos,
verifyPos = verifyPos,
close = close,
ioDesc = ioDesc }
end
fun textStreamToBinStream' textStream =
let
val (textWriter, bufferMode) = TextIO.StreamIO.getWriter textStream
in
BinIO.StreamIO.mkOutstream (textWriterToBinWriter textWriter, bufferMode)
end
fun textStreamToBinStream textStream =
let
val textStream' = TextIO.getOutstream textStream
in
BinIO.mkOutstream (textStreamToBinStream' textStream')
end
原则上,应该可以将TextIO.outstream写入BinIO.outstream转换函数(反之亦然),但虽然相对机械,但需要一些工作。您需要实施:
Byte
结构,一个转换函数TextPrimIO.writer->BinPrimIO.writer
TextIO.StreamIO.outstream->BinIO.StreamIO.outstream
TextIO.outstream->BinIO.outstream
如果你只需要写一个Word8向量,那么事先把它转换成字符串就足够了,例如使用
字节结构。我没有什么好的建议。但是我使用的解决方法(因为它是最快的,绝对不是最干净的)是使用Byte.bytesToString
。我认为没有办法从一种流类型转换到另一种流类型。你能给我们展示一下f
的实现吗?也许可以将它推广到这两种流类型。