Haskell中case of语句‘->’解析错误的问题排查
解决Haskell case表达式的解析错误
这个parse error on input ‘->’错误的根源很明确——你在case表达式的分支之间缺少了必要的分隔符。
Haskell的case表达式规则是:当把多个分支写在同一行(或者用大括号包裹时),每个分支必须用分号(;)隔开;如果是换行写分支,只要保证所有分支缩进对齐,就可以不用分号,编译器会通过缩进识别分支边界。
你原来的代码里,第一个分支Mercury -> seconds * 0.2408467后面没有加分号,直接跟着Venus的分支,编译器根本没法区分这是两个独立的分支,反而把Venus -> ...当成了前面表达式的一部分,自然就报错了。
修正后的代码(推荐多行缩进写法)
这种写法符合Haskell的惯用风格,可读性更高:
module SpaceAge (Planet(..), ageOn) where data Planet = Mercury | Venus | Earth | Mars | Jupiter | Saturn | Uranus | Neptune ageOn :: Planet -> Float -> Float ageOn planet seconds = case planet of Mercury -> seconds * 0.2408467 Venus -> seconds * 0.61519726 Earth -> seconds * 1 Mars -> seconds * 1.8808158 Jupiter -> seconds * 11.862615 Saturn -> seconds * 29.447498 Uranus -> seconds * 84.016846 Neptune -> seconds * 164.79132
如果你偏好单行写法(需要加对分号)
如果一定要把分支写在一行(或者用大括号包裹),记得给每个分支末尾加上分号:
module SpaceAge (Planet(..), ageOn) where data Planet = Mercury | Venus | Earth | Mars | Jupiter | Saturn | Uranus | Neptune ageOn :: Planet -> Float -> Float ageOn planet seconds = case planet of { Mercury -> seconds * 0.2408467; Venus -> seconds * 0.61519726; Earth -> seconds * 1; Mars -> seconds * 1.8808158; Jupiter -> seconds * 11.862615; Saturn -> seconds * 29.447498; Uranus -> seconds * 84.016846; Neptune -> seconds * 164.79132 }
其实你说已经把分支垂直对齐,应该是想采用多行缩进的写法,但可能不小心把换行弄丢了,或者没去掉大括号。只要按照上面的两种方式调整,这个解析错误就能解决啦。
内容的提问来源于stack exchange,提问作者MangoPizza
相关产品推荐
相关产品推荐

