Haskell如何将一个函数中接收到的列表传递给另一个函数?
修复方案
你当前的代码存在变量遮蔽问题:valida函数的形参名是r,但where子句中又定义了同名的r变量,导致外层传入的列表参数被覆盖,根本无法访问到外部传入的列表。
只需要做两处简单修改就能达成需求:
- 把
valida的形参重命名为不冲突的名称(比如lst) - 将
duplicador调用位置的固定列表[1, 3, 8, 6]替换为这个形参
修改后的完整代码如下:
module Main where duplicador :: [Integer] -> [Integer] duplicador [] = [] duplicador (x:[]) = [x] duplicador (x:y:zs) | length (x:y:zs) `mod` 2 /= 0 = x : y*2 : duplicador zs | otherwise = x*2 : y : duplicador zs valida :: [Integer] -> Bool valida lst | r == 0 = True | otherwise = False where r = sum (duplicador lst) `mod` 10 main = do print(valida [1, 3, 8, 6])
注:上述代码还做了一处可选优化,将foldr (\x y -> x+y) 0替换为了Haskell标准库中自带的sum函数,功能完全等价,代码更简洁。
内容的提问来源于stack exchange,提问作者Horácio
相关产品推荐
相关产品推荐

