haskell-jp / questions #103 at 2023-02-09 19:03:54 +0900

RIOパッケージをbase代替として取り入れています。
RIO.Utf8Builder の値を ロギング用途ではなく 標準出力に吐き出すには何を用いるのが良いのでしょうか?
具体的にやりたいこととしては、情報を標準出力に出力するCLIツールを作ろうとしています。
今はとりあえずTextやByteStringに変換した後に putStrLn 等で出力をしているのですが、他により良い方法があったりしますか?

【現状の方法だった場合: ByteStringにするべきかTextにするべきか】
Text or ByteStringへの変換をする場合、どちらの方が良いとかあるでしょうか?それともあまり考えなくて良いのでしょうか
最初は`textDisplay` が用意されていることから、Textを使うべきなのかな?と思っていました。
しかし、`RIO.Utf8Builder`が内部的には Data.ByteString.Builder.Builder を用いているようなのでByteStringの方が良いのかな?とも考えて悩んでいます。
取り急ぎ。本当にバイナリーデータを出力したいのでなければ ByteString を出力には使わない方がいいです。
Hiromi ISHII / mr_konn
logOptionsHandle でハンドルを変えられるので、これに stdout を渡してやる感じになりますね
Hiromi ISHII / mr_konn
ログ出力じゃないということであれば、Utf8Builder の内側の Builder を取り出して、hPutBuilder stdout などとして直接吐いてやる感じかと思います
Hiromi ISHII / mr_konn
(まあ、そもそもログ用途ではないということであればわざわざ RIO の Display / Utf8Builder に無理にのっかる必要は特にないかと思います
@igrep
ありがとうございます。基本的なこととして頭に入れておこうと思います!

@Hiromi ISHII / mr_konn
ありがとうございます。今回はログ出力ではないので、 Builder を取り出してみようかなと思います。

今回 Utf8Builder を用いているのは、既存のライブラリで定義されているデータ型(具体的には等)をテキスト表示したく、Showでは欲しい出力にならなかったためです。それ以外は別段 Utf8Builder を使用する拘りはありません。
Hiromi ISHII / mr_konn
あーなるほど!Displayの結果を使いたいんですね。それならBuilder取り出して使うのが良いと思います。(strictな) ByteStringをテキスト出力に使うのは、エンコーディングに気をつけていればまあ小さいデータとかであればそんなに問題にはならないと思います。大きなデータはBuilderを直接吐き出すか、Lazy ByteString/Lazy Textを使うとかになるかと思います
わかりました、ありがとうございます!
今回は小さいデータなので先程教わった方法でやってみようと思います。