【问题标题】:Haskell giving "Variable not in scope: [Integer] -> tHaskell 给出“变量不在范围内:[Integer] -> t
【发布时间】:2021-01-05 21:15:28
【问题描述】:

我只是想创建一个简单的函数,它接受一个列表并确保其中的数字按升序排列。

`ascending :: Ord t => [t] -> Bool
ascending [] = True
ascending (x:xs) = (tracker xs x)

tracker :: Ord t => [t] -> t -> Bool
tracker [] y = True
tracker (x:xs) y | if y <= x = True
                 | otherwise = False`

这是我到目前为止所拥有的,但我得到“变量不在范围内:升序 :: [Integer] -> t " 由于某种原因,我无法弄清楚如何解决此问题

【问题讨论】:

  • 看起来您在某处调用ascending 而不导入它。此外,tracker 只会检查第一个元素是否小于或等于第二个元素,而不检查其余元素是否按升序排列。
  • 你的程序也有语法错误,if不应该在守卫的情况下使用。
  • 不要在 GHCi 中逐行输入代码。将其保存在一个文件中,并在 GHCi 中使用:l FileName.hs 加载整个文件。

标签: function haskell helper tracker


【解决方案1】:

您的程序中存在语法错误,不应使用if 来防卫。因此,您可以使用以下方法修复语法错误:

tracker :: Ord t => [t] -> t -> Bool
tracker [] y = True
tracker (x:xs) y | y <= x = True
                 | otherwise = False

但是这个tracker 不足以检查整个 列表是否按升序排列,它只会检查前两个 元素是否按升序排列。在y &lt;= x 的情况下,您应该递归列表的其余部分以检查它是否也按升序排列。例如,您可以这样写:

tracker :: Ord t => [t] -> t -> Bool
tracker [] y = True
tracker (x:xs) y = y <= x && tracker xs x

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-14
    • 1970-01-01
    • 2017-09-30
    • 1970-01-01
    • 1970-01-01
    • 2022-10-08
    相关资源
    最近更新 更多