在标准ML

时间:2017-01-09 13:13:00

标签: sml

在标准ML中,我有一个写入BinIO.outstream的函数,我希望它写入标准输出。

虽然TextIO结构的stdOut类型为TextIO.outstream,但BinIO没有此类变量,且TexIO.outstreamBinIO.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

1 个答案:

答案 0 :(得分:3)

原则上,应该可以将TextIO.outstream写入BinIO.outstream转换函数(反之亦然),但是虽然相对机械,但它需要一些工作。你需要实现:

  1. 使用Byte结构,转化函数TextPrimIO.writer -> BinPrimIO.writer
  2. 使用它,转换函数TextIO.StreamIO.outstream -> BinIO.StreamIO.outstream
  3. 使用它,转换函数TextIO.outstream -> BinIO.outstream
  4. 但是,我怀疑建议进行这样的转换。特别是,操作系统界面和工具通常假设stdout和朋友实际上是文本流。

    如果您只需要编写Word8矢量,那么事先将其转换为字符串就足够了,例如:使用Byte结构。