3

Data.Time.UTCTime「%Y-%m-%d %H:%M:%S」形式のファイルを何度も読み書きする必要があるとします。

Data.Time.formatTimeorData.Time.parseTimeを使用して to/from に変換してから to / UTCTimefromStringをパック/アンパックすると、中間が含まれるため、遅すぎるように思えます。しかし、 のビルダー/パーサーを手動で記述することは、およびで既に行われた多くの作業を繰り返すように思えます。StringByteStringStringByteStringUTCTimeformatTimeparseTime

私の質問は次のとおりだと思います:多くの作業を繰り返さずに、型の関数を取得したり、変換したり、効率を高めt -> StringたりString -> tするt -> ByteString体系的な方法はありますか?ByteString -> t

私は完全に Haskell の初心者なので、質問がばかげている場合はご容赦ください。

4

2 に答える 2

4

t -> Stringいいえ、 type の関数をtypeの関数に変換する一般的な方法はありませんt -> ByteString。ByteString が単に高速なだけではないことを思い出してくださいString。それよりもレベルが低いです。AByteStringは一連のバイトです。エンコーディングを念頭に置いていない限り、それ以上の意味はありません。

したがって、オプションは次のとおりです。

  1. phgの答えのように、関数合成を使用してください:

    import Data.ByteString.Char8 as B
    
    timeToByteStr :: UTCTime -> ByteString
    timeToByteStr = B.pack . formatTime'
    
    parseBStrTime :: ByteString -> Maybe UTCTime
    parseBStrTime = parseTime' . B.unpack
    

    関数名を修正しました。また、たとえば、parseTime の代わりに parseTime' を使用して、フォーマット文字列を省略したためTimeLocale、渡す必要があります。

    Data.Text(多くの場合、 よりも の方が適していることにも注意してData.ByteString.Char8ください。後者はChar、 が Unicode コード ポイント 0 ~ 255 に該当する場合にのみ適切に機能します。)

  2. パフォーマンスが問題で、この変換がボトルネックになる場合は、パーサー/ビルダーを作成します。

  3. sを使用するだけStringです。

最後のオプションは、Haskell の初心者にとって過小評価されている選択肢です。Stringパフォーマンスに関しては最適ではありませんが、悪魔のようなものではありません。Haskell を使い始めたばかりなら、コードが遅くなりすぎない限り、生活をできるだけシンプルに保ちませんか?

于 2012-09-04T22:55:29.310 に答える
-3

大幅に最適化されたコードが本当に必要ない場合、通常の最も簡単な方法は、関数合成を使用することです。

timeToByte = toBytes . formatTime
byteToTime = parseTime . fromBytes

私はそれらのライブラリに慣れていないので、そのようなものです。

プロファイリングを行った後、この方法ではまだ時間がかかることに気付いた場合は、手動で何かを作成する必要があると思います。

于 2012-09-04T17:17:40.270 に答える