在标准ML中,我有一个写入BinIO.outstream
的函数,我希望它写入标准输出。
虽然TextIO
结构的stdOut
类型为TextIO.outstream
,但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
的最简单方法是什么?即如何实施下面的???
?
- 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
答案 0 :(得分:3)
原则上,应该可以将TextIO.outstream写入BinIO.outstream转换函数(反之亦然),但是虽然相对机械,但它需要一些工作。你需要实现:
Byte
结构,转化函数TextPrimIO.writer -> BinPrimIO.writer
TextIO.StreamIO.outstream -> BinIO.StreamIO.outstream
TextIO.outstream -> BinIO.outstream
但是,我怀疑建议进行这样的转换。特别是,操作系统界面和工具通常假设stdout
和朋友实际上是文本流。
如果您只需要编写Word8矢量,那么事先将其转换为字符串就足够了,例如:使用Byte
结构。