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价值每一步都会改变.如何只定义一次并将其值用于递归?
将递归移动到辅助函数中.该函数可以将平均值作为参数,也可以在本地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:你并没有真正计算方差,所以我建议将函数命名为其他东西.