Haskell 拥抱唐';t让脚本文件使用关键字";让我们;

Haskell 拥抱唐';t让脚本文件使用关键字";让我们;,haskell,hugs,Haskell,Hugs,我将此文件作为模块加载到Hugs,但出现以下错误: 错误文件:。\Hugs.hs:38-输入中的语法错误(意外关键字“let”) 在顶层不能有let语句。简单地写 fac n = if n == 0 then 1 else n * fac (n-1) m = MetricMeasurement 2 Meter 删除让: fac n = if n == 0 then 1 else n * fac (n-1) m = MetricMeasurement 2 Meter 正如其他人所指出的,对于

我将此文件作为模块加载到Hugs,但出现以下错误:

错误文件:。\Hugs.hs:38-输入中的语法错误(意外关键字“let”)


在顶层不能有
let
语句。简单地写

fac n = if n == 0 then 1 else n * fac (n-1)
m = MetricMeasurement 2 Meter

删除

fac n = if n == 0 then 1 else n * fac (n-1)

m = MetricMeasurement 2 Meter

正如其他人所指出的,对于顶级定义,您不使用
let
,而只用于函数中的本地定义

我之所以回答这个问题,是因为我忍不住指出,通过使用模式匹配,您可以改进很多代码

对于
符号
,可在顶层进行匹配:

symbol :: MetricUnit -> String
symbol Meter = "m"
symbol Liter = "L"
symbol KiloGram = "kg"
而对于另外两个,您可以使用case语句在
u
上进行匹配,如下所示:

convert (MetricMeasurement x u) = case u of
   Meter    -> ImperialMeasurement (1.0936*x) Yard
   Liter    -> ImperialMeasurement (0.2642*x) Gallon
   KiloGram -> ImperialMeasurement (2.2046*x) Pound
convert(ImperialMeasurement x u)
类似

convert (MetricMeasurement x u) = case u of
   Meter    -> ImperialMeasurement (1.0936*x) Yard
   Liter    -> ImperialMeasurement (0.2642*x) Gallon
   KiloGram -> ImperialMeasurement (2.2046*x) Pound