0

私はencode(JSON経由で文字列へのHaskellタイプ)を使用します:

import GHC.Generics
import Data.Aeson

文字列は (コンパイラからのエラー メッセージによると): Data.ByteString.Lazy.Internal.ByteString.

どうすればStrLnに入れられますか?

理論的に言えば

私が探しているのは、アドホックなポリモーフィックです。つまり、特定の文字列のような型のセマンティクスputStrLnの適切なインスタンスを探しています。putStrLn

コンパイラ メッセージ

誰かが興味を持っている場合のコンパイラ メッセージ:

valencies.lhs:182:22:
    Couldn't match type `Data.ByteString.Lazy.Internal.ByteString'
                  with `[Char]'
    Expected type: String
      Actual type: Data.ByteString.Lazy.Internal.ByteString
    In the return type of a call of `encode'
    In the first argument of `putStrLn', namely `(encode CALL)'
    In the expression: putStrLn (encode CALL)

こちらもご覧ください

同様の質問ですが、タイプが少し異なります: How do I putStrLn a Data.ByteString.Internal.ByteString? .

4

3 に答える 3

2

これは本当にあなたに依存しますByteString。本当に印刷可能な文字が含まれていますか? そのエンコーディングは何ですか?有効な UTF-8 が含まれていることがわかっている場合はtoStringfromを使用してから に渡すことができます。utf8-stringputStrLn

ところで、Hayooはこの種の (へへ) 質問に最適です。そこにタイプを入れると、それらのタイプの Hackage から関数が取得されます!

于 2015-02-13T14:58:04.857 に答える
2

string-classパッケージを使用できます。これには、toString関数 (デフォルトは utf-8)、fromLazyByteString関数、およびputStrLnすべての型で動作する 3 つのオプションがあります。あなたがする必要があることに注意してください:

import Prelude hiding (putStrLn)
import Data.String.Class (putStrLn)
于 2015-02-13T18:14:16.427 に答える
0

この場合、Lazyバリアントがあるため、 を使用する必要がありますData.ByteString.Lazy.putStrLn

コンパイラが興味深い警告を出すことに注意してください。

In the use of `Data.ByteString.Lazy.putStrLn'
(imported from Data.ByteString.Lazy):
Deprecated: "Use Data.ByteString.Lazy.Char8.putStrLn instead. (Functions that rely on ASCII encodings belong in Data.ByteString.Lazy.Char8)"

おそらく、UTF-8 でエンコードされた文字列が必要な場合は、推奨されているものではなく、別のバリアントを使用する必要がありますChar8。これを調べてみます。

スマート文字列クラス

賢明な方法として、Konstantine Rybnikov による別の回答string-classで言及されているパッケージもご覧ください。

于 2015-02-13T13:01:42.013 に答える