Haskell - 变量不在作用域错误 - 初学者

5

我是Haskell的新手,不知道我的代码哪里出了问题。我一直收到变量超出范围的错误。

这是我使用:load加载到GHCi中的代码:

validLength :: String -> Bool
validLength xs | length xs == 26 = True
               | otherwise = False

我输入了validLength aa,应该返回false,但是我却收到了一个错误提示。
*Main> validLength aa

<interactive>:1:13: error: Variable not in scope: aa :: String

8
我认为你的意思是 validLength "aa" - leftaroundabout
你在这里使用了一个变量 aa,很可能它并不存在。如果你想传递一个字符串,你应该使用 validLength "aa" - Willem Van Onsem
@leftaroundabout 非常感谢,是我自己的错误 :-) - Alisha White
3
请注意,操作符 == 已经返回一个布尔值。无需检查其是否为真,然后相应地返回 True/False。您可以直接返回 == 的结果,例如 isZero x = x == 0 - chi
validLength xs = length xs == 26 - chepner
2个回答

4

标识符不是字符串。(这并不特殊,大多数编程语言都是一样的。)因此,当您将aa作为参数传递时,GHC将其解释为某个变量的名称。但是,实际上没有这个名称的变量(至少在范围内),因此会出现错误。

如果您想要传递真正意义上的由两个a字符组成的字符串,那么您应该使用字符串字面量。字符串字面量只是双引号中的字符串(同样,在许多其他编程语言中都是如此)。

*Main> validLength "aa"
False

1
非常感谢您对一个初学者的简单问题提供如此好的答案,您真是太好了,谢谢您的时间。我还记得当我有同样的疑问时。 - developer_hatch

2

在你的代码中,可以添加一个返回布尔值的表达式或函数,不要害怕这样做:

:t (==)
(==) :: Eq a => a -> a -> Bool

所以,
3==4 -> False
length [1,2,3] == 26 -> False

因此,您的代码可以简单地写成:
validLength :: String -> Bool
validLength xs = length xs == 26 

或者:

validLength :: String -> Bool
validLength =  (== 26) .  length 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接