【问题标题】:Parse error while running a simple Haskell program运行简单的 Haskell 程序时解析错误
【发布时间】:2014-10-31 23:42:56
【问题描述】:

我刚刚开始学习 Haskell。我首先编写一个简单的函数,它接受两个值 n 和 x,然后显示用它计算的两个整数值。

test n x = do
    cell1 = round(n*n*x)
    cell2 = n*n - cell1
    print cell1
    print cell2

但是它没有运行并且一直给我一个Parse error on input `=' 错误。发生了什么?

【问题讨论】:

  • let cell1 = ... 而不是 cell1 = ...

标签: haskell


【解决方案1】:

你在 Monads 上遇到了第一个麻烦。您可能想要的是 let 块内的 let 语句

test n x = do
    let cell1 = round (n * n * x)
        cell2 = n * n - cell1
    print cell1
    print cell2

这里的不同之处在于您不能直接在 do 块内进行分配,因为所有 do 都会阻止对 >>=>> 的调用的脱糖。 let 语句允许您像在函数定义中一样定义局部值,例如

f x =
    let y = 2 * x
        z = y * y * y
    in z + z + y

你的函数脱糖的方式就像

test n x =
    let cell1 = round (n * n * x)
        cell2 = n * n - cell1
    in (print cell1 >> print cell2)

>> 只是将两个单子动作链接在一起。请注意,这并不是真正的脱糖方式,我选择了在这种情况下等效的表示,但它并不是编译器实际生成的。

【讨论】:

  • 除了一组多余的括号外,它正是从language report 中去糖的官方。当然编译器不会停留在那个阶段...
  • @ØrjanJohansen 我刚刚假设它可能有点不同,因为let 绑定可以使用从一元操作中提取的值(例如do { x <- m; let y = f x; return y })。
  • 好的,那我怎么在命令行调用函数呢?就像我运行程序文件一样,我只是这样做:test 2 0.4?因为这不会给我任何结果。
  • @EricaMaine 你想编译它还是在 GHCi 中加载它?而且这个函数不会返回任何东西,因为你没有告诉它,你只是告诉它打印这些值。
  • @EricaMaine 您在代码中遇到的问题很容易解决,但需要的字数超过了注释框中的内容。我鼓励您发布一个新问题,以便您可以粘贴您的代码和您看到的错误消息的全文,因为您所问的问题与上面提出的问题完全不同。我会给你提示,你的问题需要一些手动类型转换,如果你给你 test 函数一个明确的类型签名,你会更早发现问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-20
  • 1970-01-01
  • 1970-01-01
  • 2016-01-11
相关资源
最近更新 更多