我试图做一个简单的条件语句,检查一个值是否等于另一个值,然后将布尔值设置为true或false,但是我遇到了一些困难。
到目前为止,我已经尝试通过几种不同的方式来重新格式化我的文本,但没有一种有效,但是我在官方文档中或在搜索问题时都找不到太多帮助。
import Data.List
numberB :: Integer
numberB = 10
eql :: Integer -> Bool
eql = 10
if eql == numberB
then True
else False
我当前遇到的错误是:
functions.hs:14:1: error:
Parse error: module header, import declaration
or top-level declaration expected.
|
14 | if eql == numberB
| ^^^^^^^^^^^^^^^^^...
由于我找不到任何有效的导入声明,因此我不确定我要在这里做什么。我也不认为我确实需要使用任何模块,因为我不在这里创建模块,而且正如我之前提到的,我没有找到可以使这项工作成功的导入语句。我也不确定什么是顶级声明,因为我对Haskell并不了解。也就是说,我什至不知道该怎么做才能解决此错误。
任何帮助将不胜感激。
答案 0 :(得分:4)
条件声明表达式没什么问题,但是它属于什么定义?
为确定这一点,Haskell使用了 indentation 。属于某些定义的任何代码都必须在其下至少缩进一个空格:
name = -- value
if eql == numberB
then True
else False
但是您的if ...
与前面的定义eql = ...
从同一列开始。
因此,这是一段不属于任何定义的代码,而这就是您所得到的语法错误(谈论“声明”,我猜这是它的正式术语)。
在定义中
eql = 10
名称是eql
,值是10
。它与声明的类型不匹配,
eql :: Integer -> Bool
但是语法错误甚至在检查类型之前都会中止编译。
答案 1 :(得分:3)
让我们放慢速度,首先,让我们回顾一下eq的类型:
(==) :: Eq a => a -> a -> Bool
您要比较两个Integer
numberB :: Integer
numberB = 10
eql :: Integer
eql = 10
是的,一种方法是做
comparision = if eql == numberB
then True
else False
但是根据==
的定义,您可以删除if
,这是多余的,所以:
comparisionShort = eql == numberB
还要记住,在Haskell中,您必须将值绑定到某些东西,不能像这样写if
。
答案 2 :(得分:2)
您已将eql
声明为Integer -> Bool
,这是一个接收Integer并返回bool然后将其分配为Integer值10的函数。与动态类型的语言(如python)不同,您无法重新分配变量一个不同类型的值。
您可能想要的是:
numberA ::Integer
numberB ::Integer
eql :: Bool
numberA = 10
numberB = 10
eql = numberA == numberB