函数中输入')'的Haskel解析错误

时间:2018-11-05 17:11:00

标签: haskell compiler-errors

基本上我有这个代码

ola xs = foldl (\acc x -> if (chr x >= 65 && chr x <= 71 || chr x >= 97 && chr x <= 103) then acc (++) x) [] xs

当我尝试将其加载到ghci上时,它说我在最后一个parenthesys中有一个解析错误,因此您可以帮我吗?怎么了

1 个答案:

答案 0 :(得分:0)

以敏感方式查找字符串中字母A到G的所有出现记录。如评论中所述,您错过了else案例。 else情况应该只是返回acc变量。

但是程序中仍然存在错误。函数chr接受一个数字并返回ascii字符。您需要的是ord,它接受char并返回ascii值。

因此您的程序版本将为

ola xs = foldl (\acc x -> if (ord x >= 65 && ord x <= 71 || ord x >= 97 && ord x <= 103) then acc ++ [x] else acc) [] xs

Char数据类型已经属于Ord类,因此您可以对其进行比较。无需使用ord。这样,您可以在上面写为

ola xs = foldl (\acc x -> if (x >= 'A' && x <= 'G' || x >= 'a' && x <= 'g') then acc ++ [x] else acc) [] xs

列表中有一个特殊功能,称为过滤器,它仅从列表中获取所需的元素。使用过滤器将上面的程序。

ola xs = filter (\x -> x >= 'A' && x <= 'G' || x >= 'a' && x <= 'g') xs

现在该参数可以简单地删除,并且可以简单地写为

ola = filter (\x -> x >= 'A' && x <= 'G' || x >= 'a' && x <= 'g')

奖金:- 但是现在,如果您要检查一些随机字符该怎么办。您可以首先为要过滤的字符创建一个字符串。对于上面的示例,就足够了。

strList=['A'..'G','a'..'g'];

现在使用elem进行过滤。 elem检查字符串中是否存在给定元素。

ola xs = filter (\x -> elem x strList) xs

奖金2:- 如果要删除参数xs怎么办。为此,您首先需要翻转elem的参数,这样列表才是第一位。

ola = filter ((flip elem) strList)