Haskell报parse error on input `list'解析错误如何解决
修复方案
你的代码总共有四个问题,改完就能正常运行:
- 第一个是缩进错误:Haskell顶层的定义必须顶格写,你给
list、inv开头加了多余空格,直接触发parse error on input 'list'的解析报错。 - 第二个是函数调用逻辑错:你写的
print inv (list)不符合Haskell的函数调用规则,Haskell函数调用优先级最高、默认左结合,这行代码会被解析成先执行print inv,再把list当参数传给print的返回值,完全不是你要的效果;而且你要给列表每个元素取倒数,不能直接把整个列表传给inv,得用map把inv逐个作用到列表元素上。 - 第三个是数学逻辑错:对数的底数不能为1,你列表推导式里a从1开始取值,
logBase 1 b是无意义的,会算出无穷大或者非数值,这就是你逐行输入时list结果异常的原因。另外你写的[1,2..]是无穷列表,虽然有小于100的守卫条件,但直接写有限范围更稳妥,避免求值时出现意外卡死的问题。 - 第四个是入口缺失:直接编译运行Haskell源码文件必须定义
main函数作为执行入口,不能在顶层直接写执行语句。
修复后的完整可运行代码如下:
import Data.List import System.IO list = [logBase a b | a <- [2..99], b <- [2..99]] inv x = 1 / x main :: IO () main = print $ map inv list
代码里用map inv list生成所有元素取倒数后的新列表,$用来调整函数应用优先级,等价于print (map inv list),直接运行就能输出正确结果。
内容的提问来源于stack exchange,提问作者Pauline Yoo
相关产品推荐
相关产品推荐

