1

例えば;

  data TRAINING=AGAIN Int [TRAINING]
                |RUN
                |JUMP
                |PUNCH Int 
           deriving (Eq,Show,Read)

が定義されており、ユーザーが次のようなものを入力した場合:

  "RUN, PUNCH 15, AGAIN 3 [JUMP, AGAIN 2 [PUNCH 20]]"

その後、プログラムは戻ります

  [RUN,PUNCH 15,AGAIN 3 [JUMP,AGAIN 2 [PUNCH 20]]]

だから私は書いた

  fight :: String->[TRAINING]
  fight xs=[read xs ::TRAINING]

しかし、「no parse Exception」が発生しています。私は初心者で、「no parse Exception」とは何か、どのように修正できるか知りたいですか?

4

2 に答える 2

6

解析なしの例外は、Haskell に指定したものが のインスタンスの正しいパターンではないことを意味しますRead。この場合、リストが次のように表示されるためです。

[<show element>,<show element>...]

そして、外側のブラケットがありません。それを修正することは、出力がどうあるべきかを見るのと同じくらい簡単です:

Prelude> show [RUN,PUNCH 15,AGAIN 3 [JUMP,AGAIN 2 [PUNCH 20]]]
         "[RUN,PUNCH 15,AGAIN 3 [JUMP,AGAIN 2 [PUNCH 20]]]"

そのため、全体を [] で囲む必要があります。あなたの機能は正しいです。入力文字列が少し間違っているだけです。

この制限が気に入らない場合は、Parsec などで単純なパーサーを作成するだけの時期かもしれません。ただし、Haskell をまったく初めて使用する場合、これは少し難しいかもしれません。

于 2013-05-25T12:21:22.933 に答える
1

言い換えれば、jozefgの答えに従ってください:

fight xs = read xs ::[TRAINING]

また:

"[RUN, PUNCH 15, AGAIN 3 [JUMP, AGAIN 2 [PUNCH 20]]]"
于 2013-05-25T12:37:48.940 に答える