例如;
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]
但我得到“没有解析异常”。我是新手,我想知道“没有解析异常”是什么以及如何解决它?
答案 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]]]"