保存变量并在递归时使用它

And*_*llo 1 recursion haskell functional-programming

假设我有以下功能

printVariance :: [Float] -> IO ()
printVariance [] = return ()
printVariance (x:xs)
    | x >= avg (x:xs) = print (x - avg (x:xs)) >> printVariance xs
    | otherwise       = printVariance xs
Run Code Online (Sandbox Code Playgroud)

获取一个列表,检查哪些元素大于平均值并打印它们value - avg.

我的问题是avg价值每一步都会改变.如何只定义一次并将其值用于递归?

sep*_*p2k 6

将递归移动到辅助函数中.该函数可以将平均值作为参数,也可以在本地printVariance定义并定义另一个保持平均值的局部变量,然后函数可以访问该变量.

在代码中:

printVariance :: [Float] -> IO ()
printVariance xs = loop xs
  where
    average = avg xs
    loop [] = return ()
    loop (x:xs)
      | x >= average = print (x - average) >> loop xs
      | otherwise = loop xs
Run Code Online (Sandbox Code Playgroud)

PS:将IO与程序逻辑分开是一个很好的设计.所以我建议你让你的函数只生成一个你想要的值列表,而不是打印它们并将IO移动到一个单独的函数(或只是main).

PPS:你并没有真正计算方差,所以我建议将函数命名为其他东西.