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

时间:2017-02-05 16:47:48

标签: haskell recursion functional-programming

假设我有以下功能

printVariance :: [Float] -> IO ()
printVariance [] = return ()
printVariance (x:xs)
    | x >= avg (x:xs) = print (x - avg (x:xs)) >> printVariance xs
    | otherwise       = printVariance xs

获取列表,检查哪些元素大于平均值并打印其value - avg

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

1 个答案:

答案 0 :(得分: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

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

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