【问题标题】:Haskell error - parse error on input '|'Haskell 错误 - 输入“|”上的解析错误
【发布时间】:2018-02-19 01:10:38
【问题描述】:

我目前正在为一门侧重于 Haskell 编码的课程做作业,但在我的一个练习中遇到了问题。这是具体的练习:

一天中的时间可以用元组(小时,分钟,m)表示,其中 m 表示“AM”或“PM”。开发一个 Boolean Haskell 函数 comeBefore,它接受两个时间元组并确定第一个是否比第二个更早。

这是我的解决方案代码:

comesBefore :: (Int,Int,String) -> (Int,Int,String) -> Bool

comesBefore (x1,y1,z1)(x2,y2,z2) | (x1<x2) = True
| (x1>x2) = False
| (x1==x2) && (y1<y2) = True
| (x1==x2) && (y1>y2) = False
| (x1==x2) && (y1==y2) && (z1=="AM") && (z2=="PM") = True
| (x1==x2) && (y1==y2) && (z1=="PM") && (z2=="AM") = False

main= print(comesBefore (4,20,"AM")(4,15,"AM"))

我收到的错误是第一个“|”的“错误:输入“|”时解析错误”。我看到这是 Haskell 程序的常见错误,我尝试了不同的间距解决方案,但没有任何效果。任何帮助,将不胜感激!谢谢! :)

【问题讨论】:

    标签: haskell


    【解决方案1】:

    您需要缩进那些| 行多于comesBefore

    comesBefore (x1,y1,z1)(x2,y2,z2) | (x1<x2) = True
      | (x1>x2) = False
      | (x1==x2) && (y1<y2) = True
      | (x1==x2) && (y1>y2) = False
      | (x1==x2) && (y1==y2) && (z1=="AM") && (z2=="PM") = True
      | (x1==x2) && (y1==y2) && (z1=="PM") && (z2=="AM") = False
    

    里面有很多多余的比较。你可以消除这些:

    comesBefore (x1,y1,z1) (x2,y2,z2)
      | x1 < x2 = True
      | x1 > x2 = False
      | y1 < y2 = True
      | y1 > y2 = False
      | z1 == "AM" && z2 == "PM" = True
      | z1 == "PM" && z2 == "AM" = False
    

    最后,我们实际上可以摆脱所有守卫,因为您只是检查一些条件并返回一个布尔值:

    comesBefore (x1,y1,z1) (x2,y2,z2) =
        x1 < x2 || (x1 == x2 && (y1 < y2 || (y1 == y2 && z1 == "AM" && z2 == "PM")))
    

    这和以前的版本不太一样,因为这个总是返回一个值。如果字符串不是"AM"/"PM""PM"/"AM",则未定义您的原始版本。

    【讨论】:

    • 由于"AM" &lt; "PM" 最终实现comesBeforecomesBefore = (&lt;) 相同。我怀疑"AM""PM" 应该先比较,在时间之前:comesBefore (h1, m1, p1) (h2, m2, p2) = (p1, h1, m1) &lt; (p2, h2, m2)。这两个都可能错过了练习的重点(自己弄清楚元组的顺序是什么)。
    猜你喜欢
    • 2011-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多