0

以下代码拒绝编译。请客气,我已经使用 Haskell 工作了 1.5 周。所以只是初学者。

                       name = (mod ( tag + x + (div ( 31 * m )  12 )) 7 )  

我在输入“=”上有解析错误它与以下行有关:

name = (mod ( tag + x + (div ( 31 * m ) 12 )) 7 )

我不知道那条线上/那里出了什么问题。我一直在使用其他语言,但 Haskell 是一种特定的语言。

4

2 回答 2

1

不确定您想要什么,但这只是语法错误。也许您想检查是否相等(然后使用==而不是=)。但情况可能并非如此,因为返回类型应该是Bool,而不是String。此外,该示例看起来很奇怪,因为并非函数的所有参数weekday都在其定义中使用。

更新

我怀疑,你的代码应该是这样的:

weekday :: Int -> Int -> Int -> String
weekday jahr monat tag =
  let name = (mod ( tag + x + (div ( 31 * m )  12 )) 7 )
  in
    case name of
    0 -> "Sonntag"
    1 -> "Montag"
    2 -> "Dienstag" 
    3 -> "Mittwoch"
    4 -> "Donnerstag"
    5 -> "Freitag"
    6 -> "Samstag"
  where                        
    y = jahr - ( div ( 14 - monat )  12 )   
    x = y + ( div y 4 ) - ( div y 100 ) + ( div y 400 )
    m = monat + (12 * ( div ( 14 - monat ) 12 )) - 2 

它甚至可以工作(虽然我没有检查结果):http: //ideone.com/YAKXTU

您应该更多地了解基本 Haskell 构造let和的含义where,并且有一本好书“Learn You a Haskell for Great Good!” 我推荐的。祝你好运!

于 2013-10-26T10:10:34.913 回答
0

您可以使用where绑定在 Haskell 中引入名称。

weekday jahr monat tag = <function body>
  where name = (mod ( tag + x + (div ( 31 * m )  12 )) 7 )

也就是说,您需要where在函数的子句中定义变量。您可以在Learn You a Haskell中阅读有关where子句的更多信息。

关于你的第二个问题:你可以在 Haskell 代码中使用制表符,只是在 Haskell 代码中,我们很少谈论“缩进代码块”——制表符很好的地方。我们主要尝试对齐函数参数,空格更适合对齐。

于 2013-10-26T10:11:03.700 回答