我是初学者,我正在尝试编写一个函数来检查字符串是否可以解释为数字。这是我的代码:
string' xs = if (all isDigit xs == False)
then "can not be interpreted"
else read xs::Int
但它一直报告错误“无法匹配预期类型'[Char]'与实际类型'Int'” 我不知道为什么,有人遇到过这个问题吗?
答案 0 :(得分:4)
你的if-then-else的两个分支都需要具有相同的类型。你的"然后" branch的类型为[Char]
,而你的" else" branch的类型为Int
。看起来像你的"然后"分支应该导致某种错误。在这种情况下,您可以使用error,它具有多态类型,可以替代使用。
更好的解决方案(在评论部分中建议)将使用Either类型,该类型可以返回两个选项之一(Left
或Right
)。
string' xs = if (all isDigit xs == False)
then Left "can not be interpreted"
else Right (read xs::Int)
另一个常见的事情是使用Maybe类型
string' xs = if (all isDigit xs == False)
then Nothing
else Just (read xs::Int)