Haskell “上的输入错误”=&引用;哈斯克尔
以下代码拒绝编译。 请客气一点,我已经和哈斯克尔一起工作了1.5周了。所以我只是个初学者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有点特别 不确定您想要什么,但这只是语法错误。也许您想检查是否相等(然后使用=而不
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
,但这只是一种风格选择。)