我正在实现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
为界的变量,我们可以简单地将其与 evens
和 odds
放在同一级别:
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
, - 但您在evens
和odds
中都使用它.它在odds
范围内,但不适用于evens
。
要在evens
和odds
中使用它,您可以在同一级别定义它,无需嵌套:
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..]