0

私は haskell を初めて使用し、問題について少し助けが必要です。XML ファイルがあり、その中の 2 つのものを解析したいと考えています。1 つは数字のペアで、2 番目は単なる文字です。私は 2 つの関数を使用して各要素を解析していますが、その関数の結果は "Maybe String" でなければなりません。そうでなければ機能しません。

問題は、結果を表示すると、常に「Just」が添付されていることです。したがって、(1,2)Bのようなものを表示したい場合

I will have (Just "1", Just "2") and Just "B"

数字については、解決策を得ました。ペアの解析から取得したリストを操作するために、この関数を作成しました。

pair:: [(Maybe String, Maybe String)] -> [(Int, Int)]
pair [] = []
pair ((Just x, Just y) : ls) = (read x, read y) : pair ls

それは正常に動作します。しかし、文字を含むリストに対して同じことを試みましたが、機能しません。

ここに私のコードがあります:

letter :: [Maybe String] -> [Char]
letter [] = []
letter (Just x : ls) = read x : letter ls

これを実行すると、ペアのリストが正しく表示され、このエラーが発生します

myfile.hs: Prelude.read: no parse

なぜこうなった?読み取り機能が問題ですか?

4

2 に答える 2

3

readパーサーCharは、文字が一重引用符で囲まれていることを想定しています。つまり、 のような文字列が必要です"'M'"

Prelude> read "M" :: Char
*** Exception: Prelude.read: no parse
Prelude> read "'M'" :: Char
'M'

あなたはおそらく次のようなことをしたいでしょう

letter :: [Maybe String] -> [Char]
letter [] = []
letter (Just [x] : ls) = x : letter ls

ただし、これはもちろん、常に値のみを取得し、Just値を取得せずNothing、すべての文字列の長さが 1 である必要がある場合にのみ機能します。そうしないと、パターン マッチが失敗します。

于 2013-11-13T17:33:20.117 に答える
0

文字の定義を次のように変更します。

letter :: [Maybe String] -> [Char]
letter [] = []
letter (Just x : ls) = (head x) : letter ls

説明:read文字列の内容を Haskell Char リテラルとして読み取ろうとします。Haskell の Char リテラルは引用符で終了するため、文字列にはそれらを含める必要があります (つまりread "'B'" :: Char、動作するかどうread "B" :: Charか)。

于 2013-11-13T17:34:40.570 に答える