假设我有以下功能
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
值会改变每一步。如何只定义一次并将其值用于递归?
答案 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:你并没有真正计算方差,所以我建议将这个函数命名为其他东西。