2016-09-17 206 views
0

基本的問題...我想映射在列表和應用功能,每一個元素,但是我想從另一個函數執行此:Haskell - 將參數傳遞給map函數?

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

你可能想這樣的:

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

上面,我們使用匿名函數(\el -> fOne el ave),這是函數映射每個elfOne el ave。通過這種方式,我們將fOne的第二個參數修復爲想要的值。

另外,

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

div整數除法,/僅適用於浮點數。

flip ff的功能相同,但前兩個參數的順序不同。

也有可能:map (`fOne` ave) list

+0

你可以從你的第一個例子中解釋'(\ el - > fOne el ave)'在做什麼嗎?那麼我可以接受 –

+2

@barbrac這是一個函數的語法。它是'\ PARAMETER - > BODY',即在這種情況下,它是一個函數,它取值('el')並返回'fOne el ave'。 – melpomene

+0

爲什麼要翻轉?加法是可交換的,所以只需要'map(fOne ave)list'。 – amalloy