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

nbd*_*dip 1 haskell types

例如;

  data TRAINING=AGAIN Int [TRAINING]
                |RUN
                |JUMP
                |PUNCH Int 
           deriving (Eq,Show,Read)
Run Code Online (Sandbox Code Playgroud)

是定义的,我希望如果用户输入如下内容:

  "RUN, PUNCH 15, AGAIN 3 [JUMP, AGAIN 2 [PUNCH 20]]"
Run Code Online (Sandbox Code Playgroud)

然后程序应该返回

  [RUN,PUNCH 15,AGAIN 3 [JUMP,AGAIN 2 [PUNCH 20]]]
Run Code Online (Sandbox Code Playgroud)

所以我写了

  fight :: String->[TRAINING]
  fight xs=[read xs ::TRAINING]
Run Code Online (Sandbox Code Playgroud)

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

Dan*_*zer 6

没有解析异常意味着你给Haskell的东西不是实例的正确模式Read.在这种情况下,因为列表显示如下:

[<show element>,<show element>...]
Run Code Online (Sandbox Code Playgroud)

你错过了外括号.修复它就像看到输出应该是什么一样容易:

Prelude> show [RUN,PUNCH 15,AGAIN 3 [JUMP,AGAIN 2 [PUNCH 20]]]
         "[RUN,PUNCH 15,AGAIN 3 [JUMP,AGAIN 2 [PUNCH 20]]]"
Run Code Online (Sandbox Code Playgroud)

所以你需要用[]来包围整个事物.你的功能是对的,你输入的字符串稍微不正确.

如果你不喜欢这个限制,可能是时候用Parsec或类似的东西编写一个简单的解析器了.虽然如果你对Haskell完全陌生,这可能会有点挑战.