【问题标题】:Haskell Printing a hardcoded value from a functionHaskell 从函数打印硬编码值
【发布时间】:2018-10-02 20:03:14
【问题描述】:

我将通过Haskell 开始我对函数式编程的第一次探索。我在打印硬编码值时有点挣扎。我创建了一个模型,代表汽车及其可以行驶的档位。我想要做的只是在我调用printCar. 时打印我的硬编码civicNinetyOne 但是当我加载文件时我不断收到错误消息。我在下面发布了错误,这是一个缩进错误,但从我在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

【问题讨论】:

  • () 在这里做什么?
  • 我读到()-> 可以添加到函数声明中以指定不接收任何参数。 -> 后面的值是返回类型。 Haskell 不是这样吗?
  • 不,你的函数声明中根本没有参数。 ()单位类型
  • @jberryman 我更新了降价并修复了间距。现在的代码看起来和我的 .hs 文件一模一样。
  • 您的直接问题是let。它不像你认为的那样工作。当你解决这个问题时,() 应该去。也许和printCar一起,因为它和civicNinetyOne完全一样。

标签: haskell winghci


【解决方案1】:

printCar 像任何其他函数一样接受参数;它的参数类型是(),这意味着只有一个值(也拼写为())可以用来调用它。

另一方面,civicNinetyOneCar 类型的值,而不是 () -> 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(如 cmets 中所指出的)在最新版本的 GHCi 中是可选的,在旧版本的 GHCi 中是必需的,但在模块中禁止。 (交互式解释器的行为有点像隐含的do 块。)

【讨论】:

  • 那绝对是我的错误。我不希望传递任何参数。回到家后,我将更新代码以删除 ()-> 所以它不接受任何值
  • Haskell 中没有零参数函数。 printCar :: Car 只是一个值,例如 civicNinetyOne
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多