Sml 以标准ML格式将TextIO流转换为BinIO流

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:

在标准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: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
  • 然而,我怀疑是否建议进行这样的转换。特别是,操作系统接口和工具通常假定stdout和friends实际上是文本流


    如果你只需要写一个Word8向量,那么事先把它转换成字符串就足够了,例如使用
    字节
    结构。

    我没有什么好的建议。但是我使用的解决方法(因为它是最快的,绝对不是最干净的)是使用
    Byte.bytesToString
    。我认为没有办法从一种流类型转换到另一种流类型。你能给我们展示一下
    f
    的实现吗?也许可以将它推广到这两种流类型。