为何添加分号可解决GHC编译的print多参数错误?
分号解决编译错误的原因:和GHC解析规则直接相关
这事儿本质就是Haskell的**布局规则(Layout Rule)**在起作用,GHC完全是按照这套规则来解析代码的,具体原因拆解如下:
函数应用是Haskell优先级最高的语法
你把三条print写在同一行又没加分号时,GHC会默认把print 1 print 2 print 3当成连续的函数调用——也就是print 1 (print 2 (print 3))。但print的类型是Show a => a -> IO (),只能接受一个参数,这种写法相当于硬塞给它多个参数,自然会触发“参数数量不匹配”的报错。do块的语句分隔逻辑
do块里的独立IO语句,默认靠缩进对齐区分——比如每个语句单独占一行、缩进一致,GHC会自动识别成不同的动作。但如果把多个语句挤在同一行,缩进规则就失效了,这时候必须用分号;明确告诉解析器:这里是语句的分界点,不是函数调用的参数。
加了分号后,print 1; print 2; print 3会被拆成三个独立的IO ()动作,完全符合do块的要求,所以能正常编译。布局规则的本质是语法糖
Haskell的缩进规则只是{}和;的语法糖,比如正常的do块其实等价于do { print 1; print 2; print 3 }。当缩进没法帮GHC判断语句边界时,就得手动补充分号,不然解析器会按照函数应用的逻辑去处理,结果自然出错。
内容的提问来源于stack exchange,提问作者Otávio Augusto Silva
相关产品推荐
相关产品推荐

