Haskell从函数打印硬编码值

时间:2018-10-02 20:03:14

标签: haskell winghci

我开始用Haskell进行函数式编程的第一次探索。我在打印硬编码值方面有些挣扎。我创建了一个代表汽车及其行驶齿轮的模型。我想做的只是在调用civicNinetyOne时打印我的硬编码printCar.,但是在加载文件时却不断出现错误。我在下面发布了该错误,它是一个缩进错误,但是根据我在LearnYouAHaskell处看到的内容,调用函数声明是正确的。有人可以指出我这个问题的原因吗?谢谢

错误

first_program.hs:10:1: error:
    parse error (possibly incorrect indentation or mismatched brackets)
   |
10 | printCar:: () -> Car    | ^

代码

data Car = Car{
   gears :: [String],
   currentGear :: String,
   brokeGears :: [String],
   shiftStroke:: Strokes
  }  

let civicNinetyOne = Car ["gear1", "gear2", "gear3", "gear4", "gear5"] "gear1" ["gear4"] [("gear1","pull", "gear2"), ("gear2","push", "gear3"), ("gear3","skipShift", "gear5")] 

printCar:: () -> Car
printCar = civicNinetyOne

1 个答案:

答案 0 :(得分:1)

printCar与其他函数一样接受参数;它的参数类型为(),这意味着只能使用一个值(也拼写为())。

另一方面,

civicNinetyOne是类型为Car的值,而不是类型为() -> Car的函数,因此不能将自身分配给printCar

正确的定义是

printCar :: () -> Car
printCar () = civicNinetyOne

它将被称为

> printCar ()
Car {gears = ["gear1","gear2","gear3","gear4","gear5"], currentGear = "gear1", brokeGears = ["gear4"], shiftStroke = [("gear1","pull","gear"),("gear2","push","gear3"),("gear3","skipShift","gear5")]}   

为完整起见,let(如注释中所指出)在GHCi的最新版本中是可选的,而在旧版本的GHCi中则是必需的,但在模块中禁止。 (交互式解释器的行为有点像暗含的do块。)