2016-09-17 31 views
0

基本的な質問...私は、しかし、私は別の関数からこれを実行するには、リストの上にマッピングし、各要素に関数を適用したい:Haskell - マップ関数に引数を渡す?

functionOne :: Int -> Int -> Int --Add x to each element of the list 
functionOne element x = element + x 

functionTwo :: [Int] -> (Int -> Int -> Int) -> [Int] 
functionTwo list fOne = map list fOne ave --map list by applying functionOne with ave as x 
    where 
    ave = ((sum list)/length list) 

なぜこの作業ではないのですか?

答えて

2

あなたはおそらく、この欲しい:我々はfOne el aveに各elをマッピングする機能である匿名関数(\el -> fOne el ave)を使用し、上記

functionTwo :: [Int] -> (Int -> Int -> Int) -> [Int] 
functionTwo list fOne = map (\el -> fOne el ave) list 
    where 
    ave = sum list `div` length list 

を。このようにして、2番目の引数fOneを希望の値に固定します。

あるいは、整数除算のため

functionTwo :: [Int] -> (Int -> Int -> Int) -> [Int] 
functionTwo list fOne = map (flip fOne ave) list 
    where 
    ave = sum list `div` length list 

div/のみ浮動小数点数で動作します。

flip fは、fと同じ機能ですが、最初の2つの引数は他の順序になります。

map (`fOne` ave) listでも可能です。

+0

最初の例から、 '(el - > fOne el ave)'が何をしているのか説明できますか?それから私は –

+2

@ barbracを受け入れることができますそれは関数の構文です。それは '\ PARAMETER - > BODY'です。つまり、この場合、値(' el')をとり 'fOne el ave'を返す関数です。 – melpomene

+0

なぜフリップですか?加算は可換ですので、 'map(fOne ave)list'だけです。 – amalloy

関連する問題