Haskell代码运行报Parse error错误,如何修复使其可在CMD执行?
报错原因
Haskell 模块的顶层仅允许出现模块声明、import 导入语句、顶层变量/函数绑定声明,你代码第7行的列表推导是直接的执行表达式,不属于合法的顶层语法结构,因此触发解析错误。
修复方案
有两种常用修改方式,可按需选择:
- 方式1:给表达式添加顶层绑定,加载模块后手动调用查看结果
修改后完整代码如下:
module Examples where import System.Random import Data.List cars = ["Ferrari", "Audi", "Honda","McLaren","Merc"] cmp (x1,y1) (x2,y2) = compare y1 y2 -- 给列表推导添加顶层变量绑定 shuffledCars = [car | (car, n) <- sortBy cmp(zip cars (randoms (mkStdGen 123456) :: [Int]))]
修改完成后在 CMD 中用 GHCi 加载模块,输入 shuffledCars 即可输出打乱后的车辆列表。
- 方式2:封装为main函数,可直接编译运行或加载后自动执行
修改后完整代码如下:
module Examples where import System.Random import Data.List cars = ["Ferrari", "Audi", "Honda","McLaren","Merc"] cmp (x1,y1) (x2,y2) = compare y1 y2 main :: IO () main = print [car | (car, n) <- sortBy cmp(zip cars (randoms (mkStdGen 123456) :: [Int]))]
修改完成后可直接用GHC编译为可执行文件在CMD运行,或在GHCi加载模块后输入 main 即可直接输出结果。
可选优化
你定义的cmp函数可以直接替换为Data.Ord里的comparing snd,不需要手动编写比较逻辑,简化后对应代码行可以写为:shuffledCars = [car | (car, n) <- sortBy (comparing snd) (zip cars (randoms (mkStdGen 123456) :: [Int]))]
内容的提问来源于stack exchange,提问作者unknown
相关产品推荐
相关产品推荐

