1

次の問題があります。Gtk2Hs と Glade を使用して、Haskell で BASE64 Encoder の簡単な GUI を作成しようとしています。これは Haskell の BASE64 Encoder の例です。

{-# LANGUAGE OverloadedStrings #-}

import Data.ByteString.Base64
import Data.ByteString.Char8

main = do
    print $ unpack $ encode "Hello, world!"
    print $ decode "SGVsbG8sIHdvcmxkIQ=="

この例の GUI を作成したいのですが、任意の値を入力してエンコードできるようにしたいと考えています。次のコンポーネントを含むテンプレートを作成済みです: - entry1 (エンコードする値を入力するため) - ボタン (生成を開始するため) - entry2 (生成された値を表示するため)

私のハスケルコード:

entry1 <- builderGetObject hello castToEntry "entry1"
entry2 <- builderGetObject hello castToEntry "entry2"
button <- builderGetObject hello castToButton "button"
onClicked button $ do
    name2 <- get entry1 entryText
    set entry2 [ entryText := unpack $ encode name2]

コンパイル時に次のエラーが表示されます

Couldn't match expected type `ByteString' with actual type `String'
In the first argument of `encode', namely `name2'
In the second argument of `($)', namely `encode name2'
In the second argument of `(:=)', namely `unpack $ encode name2'
4

1 に答える 1

1

name2タイプは ですがString、 がencode必要ByteStringです。最も簡単なことは、pack関数 fromData.ByteString.Char8を使用して変換を行うことです。ただし、これには問題があります。ASCII コードポイントに対してのみ適切に機能します。ユーザーが非 ASCII 文字 (לדוגמה、כזה) を入力するとどうなりますか?

代わりに、テキストを UTF8 でエンコードすることをお勧めします。textそのためには、次のようなパッケージを使用します。

import qualified Data.Text as T
import qualified Data.Text.Encoding as TE

encode $ TE.encodeUtf8 $ T.pack name2
于 2014-06-20T04:12:57.773 に答える