Haskell,用MAP打印修改的列表值



我已经编写了以下代码,该代码应列出值列表并仅打印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]的任何功能都非常有限

最新更新