如何从Haskell中的String读取递归数据结构?

时间:2013-05-25 12:12:49

标签: haskell types

例如;

  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]

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

2 个答案:

答案 0 :(得分: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完全不熟悉,这可能会有点挑战。

答案 1 :(得分:1)

换句话说,按照jozefg的回答:

fight xs = read xs ::[TRAINING]

还有:

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