如何解决Haskell条件语句?

我试图做一个简单的条件语句,检查一个值是否等于另一个值,然后将布尔值设置为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并不了解。也就是说,我什至不知道该怎么做才能解决此错误。

任何帮助将不胜感激。

yuhailin405 回答:如何解决Haskell条件语句?

条件声明表达式没什么问题,但是它属于什么定义?

为确定这一点,Haskell使用了 indentation 。属于某些定义的任何代码都必须在其下至少缩进一个空格:

name =   -- value
  if eql == numberB
    then True
    else False

但是您的if ...与前面的定义eql = ...从同一列开始。

因此,这是一段不属于任何定义的代码,而这就是您所得到的语法错误(谈论“声明”,我猜这是它的正式术语)。

在定义中

eql = 10

名称是eql,值是10。它与声明的类型不匹配,

eql :: Integer -> Bool

但是语法错误甚至在检查类型之前都会中止编译。

,

让我们放慢速度,首先,让我们回顾一下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

,

您已将eql声明为Integer -> Bool,这是一个接收Integer并返回bool然后将其分配为Integer值10的函数。与动态类型的语言(如python)不同,您无法重新分配变量一个不同类型的值。 您可能想要的是:

numberA ::Integer
numberB ::Integer
eql :: Bool
numberA = 10
numberB = 10
eql = numberA == numberB

本文链接:https://www.f2er.com/3168554.html

大家都在问