例如;
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)
但我得到"没有解析异常".我是新手,我想知道"没有解析异常"是什么以及如何解决它?
没有解析异常意味着你给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完全陌生,这可能会有点挑战.
| 归档时间: |
|
| 查看次数: |
187 次 |
| 最近记录: |