You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 16:22:47