Haskell中在where binding内使用guard出现变量未定义报错咨询
报错原因
- 直接触发错误的原因是guard条件
xs == [x]中使用的变量x没有被提前绑定或声明,编译器无法识别该变量,因此抛出Not in scope: 'x'错误。 - 原有代码还存在两处隐藏的逻辑/类型问题:
- 泛型函数签名
[a] -> String与代码行为不匹配:原有代码中用xs == ""做相等判断,==运算符要求参数实现Eq类型类,同时""是[Char]类型的空值,和泛型列表类型不兼容,即使解决x的作用域问题也无法编译。 - 用相等判断匹配列表结构的写法不符合Haskell常规实践,效率更低且容易引入多余的类型约束。
- 泛型函数签名
修复方案
方案1:使用模式匹配(推荐)
直接通过模式匹配识别列表结构,不需要使用guard,也不需要引入多余的类型约束:
describelist'' :: [a] -> String describelist'' xs = "the list is : " ++ what xs where what [] = "empty list " what [_] = "singleton" what _ = "list more than or equal two elements"
方案2:保留guard写法调整判断条件
如果需要保留guard的写法,将错误的条件替换为合法的列表判断即可:
describelist'' :: [a] -> String describelist'' xs = "the list is : " ++ what xs where what xs | null xs = "empty list " | length xs == 1 = "singleton" | otherwise = "list more than or equal two elements"
内容的提问来源于stack exchange,提问作者Leo Pkm
相关产品推荐
相关产品推荐

