Haskell “上的输入错误”=&引用;哈斯克尔

Haskell “上的输入错误”=&引用;哈斯克尔,haskell,syntax-error,Haskell,Syntax Error,以下代码拒绝编译。 请客气一点,我已经和哈斯克尔一起工作了1.5周了。所以我只是个初学者 name = (mod ( tag + x + (div ( 31 * m ) 12 )) 7 ) 我在输入“=”上有解析错误,它与以下行有关: name=(mod(tag+x+(div(31*m)12))7) 我不知道那行有什么不对。我一直在使用其他语言,但Haskell有点特别 不确定您想要什么,但这只是语法错误。也许您想检查是否相等(然后使用=而不

以下代码拒绝编译。 请客气一点,我已经和哈斯克尔一起工作了1.5周了。所以我只是个初学者

                       name = (mod ( tag + x + (div ( 31 * m )  12 )) 7 )  
我在输入“=”上有解析错误,它与以下行有关:

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


我不知道那行有什么不对。我一直在使用其他语言,但Haskell有点特别

不确定您想要什么,但这只是语法错误。也许您想检查是否相等(然后使用
=
而不是
=
)。但情况可能并非如此,因为返回类型应该是
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 
它甚至可以工作(尽管我没有检查结果):


您应该进一步了解基本Haskell结构的含义
let
where
,我推荐一本好书“向您学习Haskell以获得更好的效果”。祝你好运

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

weekday jahr monat tag = <function body>
  where name = (mod ( tag + x + (div ( 31 * m )  12 )) 7 )
weekday jahr monat标签=
其中name=(mod(tag+x+(div(31*m)12))7)
也就是说,您需要在函数的
where
子句中定义变量。您可以阅读有关
where
子句的更多信息,例如中的


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

你能解释一下这个函数必须解决的问题吗(用简单的英语)?编辑答案不是回答这些问题的正确方式。@SargeBorsch我以命令式方式假设OP开始编写函数体,其中第一条语句是赋值,然后想在下面几行写更多的语句,但第一行编译失败。(或者也许OP删掉了以下几行,因为它们与手头的问题无关。)如果你看看这篇文章的编辑历史,你会发现有一段时间的信息越来越少。是的。如果我没记错的话,我在第一次编辑之前写下了那个评论。顺便说一句,这条信息被破译了,可以在我的答案中找到。@SargeBorsch是的,我看到这个问题被成功地回答了。谢谢(我唯一不同的做法是在
where
子句中用其他名称定义
name
,但这只是一种风格选择。)