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]

但我得到“没有解析异常”。我是新手,我想知道什么是“无解析异常”以及如何修复它?

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 回答