2017-02-23 5 views
0

次のコードを書きました。値のリストをとり、values > averageのみを出力し、val - avgと変更してください。 たとえば、は、System.IOprint機能を使用して、1行に1要素、4 1を印刷する必要があります。Haskell、マップで修正されたリスト値を出力する

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 

Iは> 0(一度によって修正された値を印刷するために、この時点で、どのように機能printModVal内部(マッピング関数としてmodValと)mapValを使用する方法、知りたいですマッピング機能)。 ありがとうございます。

+1

'modVal'の引数を入れ替えます。そして '(\ x - > modVal x average)'の代わりに '(modVal average)'として使うことができます。 –

答えて

3

フィルタを適用する必要があります。結果のリスト

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]のすべての関数は、パラメトリック性のためにできることは非常に限られています。

+1

これは正しいようですが、明らかに 'printModVal'は戻り値の型が' IO() 'であるため、リストを出力するのではなく、画面上に出力する必要があります。 – chi

+0

あなたは正しいです。私はすぐに多くのことをする機能には慣れていない。 –

+0

実際、IOから計算を分離することは、Haskellでは非常に慣例的です。 – chi

関連する問題