将[String]变为(Int,Int)的函数

时间:2015-11-21 17:52:41

标签: haskell

我已经潜伏在这个网站一段时间了,所以终于发布了我的第一个问题 atm我必须做一个学校项目,用haskell创建Sokoban游戏,到目前为止它一直很好,直到我到达我必须验证坐标的部分。
他们就是这样来的 11 2
3 4
5 6
它应该返回" Ok"
我有一个函数,将它们变成一个int元组,所以我可以检查它们是否指向地图内的一个地方,但是该函数不会给我一个很好的错误消息,如果它的aa或只是一个数字,我需要它做例如,那 a a 11 2
3 4
消息应为" 1",如第1行中的错误。
1 3
2
4 5
错误信息应为" 2"太
有没有办法做那种事情,我已经没有想法了 从String转换为(Int,Int)

的函数
processcoordinates::[String]->(Int,Int)  
processcoordinates [x,y]= (read x,read y)  
processcoordinates xs = error "invalid format"  

注意:上述功能适用于地图功能

我已经尝试过的但是失败的东西正在使用

的内容
valcoor::Int->[String]->Int  
valcoor n []=-1   
valcoor n ((x,y):t)  
|isDigit x && isDigit y =valcoor (n+1) t 
|otherwise =n  

注意:抱歉第一次发布问题所以我犯了很多错误:D
香港专业教育学院编辑这个功能很多次,所以我不记得它给出的错误信息的类型,虽然它们之间是
无法匹配预期类型'[String]'                 实际类型'([[Char]],[[Char]])'
 这是在用实际值测试时发生的 ([" 1"" 1"],[" 2"" 2"])

1 个答案:

答案 0 :(得分:1)

您需要创建一个parser,将字符串输入转换为数据结构。

由于这是一项功课,我不想直接回答你。相反,我建议你阅读一本伟大的书“真实世界哈斯克尔”中的Using Parsec,它解决了一个与你非常相似的问题。解析器将允许您具有良好的特定于位置的错误消息。

请注意,您可能希望将整个输入视为一个String,以便解析器完成所有操作(包括计数行等)。所以你正在寻找的签名可能就像

processcoordinates :: String -> Either ParseError [(Int, Int)]

Either的左侧部分描述错误,右侧部分描述成功结果。