11

ByteStringを読み取ろうとすると、常に次のエラーが発生します。
Prelude.read: no parse

ブラウザでのレンダリング時にこのエラーが発生する原因となるコードのサンプルを次に示します。

factSplice :: SnapletSplice App App
factSplice = do
    mbstr <- getParam "input" -- returns user input as bytestring
    let str = maybe (error "splice") show mbstr
    let n = read str :: Int
    return [X.TextNode $ T.pack $ show $ product [1..n]]

または、おそらくもっと簡単に:

simple bs = read (show bs) :: Int

何らかの理由でshow bs、結果の文字列の後に引用符が含まれます。したがって、エラーを回避するには、引用符を削除してから削除する必要がありますread。インターネットからコピーした次の関数を使用してこれを行います。

sq :: String -> String
sq s@[c]                     = s
sq ('"':s)  | last s == '"'  = init s
            | otherwise      = s
sq ('\'':s) | last s == '\'' = init s
            | otherwise      = s
sq s                         = s

その後simple bs = read (sq.show bs) :: Int、期待どおりに動作します。

  1. なぜそうなのですか?
  2. ByteStringをIntに変換する最良の方法は何ですか?
4

2 に答える 2

13

をに変換する最良の方法はByteStringXによって異なりますX。からの変換が適切である場合、ASCIIであれば、String経由することも適切です。UTF-8でエンコードされたsの場合、utf8-stringパッケージには変換関数が含まれています。タイトルに記載されているように、などの特定のタイプには、特別な高速変換が存在します。たとえば、。Data.BytString.Char8.unpackByteStringByteStringtoStringIntData.ByteString.Char8.readIntreadInteger

于 2012-01-16T23:40:42.287 に答える
10

ShowString何かの表現を作成するために使用されます。これは、デバッグプレーンテキストのシリアル化に役立ちます。型クラスは、何かをに変換するためのShow単なる凝った方法ではありませんString。これByteStringが、文字列に引用符を追加する理由です。データストリームをデバッグまたは逆シリアル化するときに、そのように読み取る方が間違いなく簡単だからです。

この関数を使用してaをData.ByteString.Char8.unpackに変換できますが、これによりバイト単位のバイトがアンパックされ、高値のUnicode文字または複数のバイトとして格納されている他の文字が台無しになることに注意してください。結果を使用する以外のことをしたい場合は、代わりにに変換することをお勧めします。これにより、この状況での柔軟性が向上します。この場合、エンコーディングがUTF8であると仮定すると(Snapのデフォルトであるはずです)、この関数を使用できます。次に、値を正しいUnicode記号でに変換するには、を使用します。ByteStringStringByteStringreadByteStringTextData.Text.Encoding.decodeUtf8TextStringData.Text.unpack

を取得したらString、好きなだけ自由にread使用できます。または、モジュールTextの関数を使用して値を直接読み取ることを選択できます。Data.Text.Read

于 2012-01-16T23:36:05.627 に答える