变量不在嵌套位置的范围内



我正在实现luhn算法,这是我到目前为止的代码:

luhn :: [Int] -> Bool
luhn xs = ((evens + odds) `mod` 10) == 0 where
      evens = sum [x | (x,i) <- reversed_indexed_xs, i `mod` 2 == 0]
      odds = sum [luhnDouble x | (x,i) <- reversed_indexed_xs, i `mod` 2 /= 0] where
            reversed_indexed_xs = zip (reverse xs) [0..]

我得到的错误是

 Variable not in scope: reversed_indexed_xs :: [(a, Integer)]
   |
33 |       evens = sum [x | (x,i) <- reversed_indexed_xs, i `mod` 2 == 0]
   |                                 ^^^^^^^^^^^^^^^^^^^
Failed, 0 modules loaded.

尽管reversed_indexed_xs在嵌套where语句中定义。我认为我的问题出在缩进上,有什么帮助吗?

你不需要另一个嵌套where,只需

luhn :: [Int] -> Bool
luhn xs = ((evens + odds) `mod` 10) == 0 where
      evens = sum [x | (x,i) <- reversed_indexed_xs, i `mod` 2 == 0]
      odds = sum [luhnDouble x | (x,i) <- reversed_indexed_xs, i `mod` 2 /= 0]
      reversed_indexed_xs = zip (reverse xs) [0..]

问题是当你写X where Y时,Y中的定义只能在表达式X中使用。在您的情况下,reversed_indexed_xs只能在odds的定义范围内使用。

您使用 odds 语句(而不是even(限定了where的范围:

luhn :: [Int] -> Bool
luhn xs = ((evens + odds) `mod` 10) == 0 where
      evens = sum [x | (x,i) <- reversed_indexed_xs, i `mod` 2 == 0]
      odds = sum [luhnDouble x | (x,i) <- reversed_indexed_xs, i `mod` 2 /= 0] where
            reversed_indexed_xs = zip (reverse xs) [0..]

由于 reversed_indexed_xs 不使用以 odds 为界的变量,我们可以简单地将其与 evensodds 放在同一级别:

luhn :: [Int] -> Bool
luhn xs = ((evens + odds) `mod` 10) == 0 where
      evens = sum [x | (x,i) <- reversed_indexed_xs, i `mod` 2 == 0]
      odds = sum [luhnDouble x | (x,i) <- reversed_indexed_xs, i `mod` 2 /= 0]
      reversed_indexed_xs = zip (reverse xs) [0..]
嵌套

where的范围仅限于其嵌套的定义 - 即 odds , - 但您在evensodds中都使用它.它在odds范围内,但不适用于evens

要在evensodds中使用它,您可以在同一级别定义它,无需嵌套:

luhn :: [Int] -> Bool
luhn xs = ((evens + odds) `mod` 10) == 0 where
      evens = sum [x | (x,i) <- reversed_indexed_xs, i `mod` 2 == 0]
      odds = sum [luhnDouble x | (x,i) <- reversed_indexed_xs, i `mod` 2 /= 0]
      reversed_indexed_xs = zip (reverse xs) [0..]

相关内容

最新更新