我已经编写了以下代码,该代码应列出值列表并仅打印values > average
,将其修改为val - avg
。例如,printModVal [9,0,6]
应该使用System.IO
print
函数打印4 1
,每行元素一个元素。
import Data.List
import System.IO
printModVal :: [Float] -> IO ()
printModVal xs = ???
where
average = (foldr (+) 0 xs) / genericLength xs
--use map here and print the values > average as value-average
modVal :: Float -> Float -> Float
modVal x y = x - y
mapVal :: (a->b) -> [a] -> [b]
mapVal f [] = []
mapVal f (x:xs) = f x : mapVal f xs
我想知道,在这一点上,如何在功能printModVal
内使用mapVal
(将modVal
作为映射函数)使用,以打印值> 0(曾经通过映射函数修改)。谢谢。
您必须应用过滤器。
到达结果列表
printModVal xs = mapM_ print $ filter (> 0) (mapVal (x -> modVal x average) xs)
where
average = (foldr (+) 0 xs) / genericLength xs
或到传入列表
printModVal xs = mapM_ print $ mapVal (x -> modVal x average) (filter (> average) xs)
where
average = (foldr (+) 0 xs) / genericLength xs
map
永远不会更改其处理的列表的长度。签名(a->b)->[a]->[b]
的任何功能都非常有限