代码之家  ›  专栏  ›  技术社区  ›  VirtualProdigy

Haskell从函数打印硬编码值

  •  1
  • VirtualProdigy  · 技术社区  · 6 年前

    我开始第一次探索函数式编程 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 回复  |  直到 6 年前
        1
  •  1
  •   chepner    6 年前

    printCar 像其他函数一样接受参数;其参数类型为 () ,这意味着只有一个值(也拼写为 () )这可以称之为。

    civicNinetyOne 另一方面,是类型为的值 Car ,不是类型的函数 () -> Car ,因此不能将自身分配给 印刷车 .

    正确的定义是

    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 块)