簡體   English   中英

Haskell:映射函數應用程序

[英]Haskell: mapping function application

一些計算,我在Haskell做的部分導致的映射函數列表FloatFloat 我想對所有這些函數應用一個參數,如下所示:

-- x :: Float
-- functions :: [Float -> Float]
map (\f -> f x) functions

有沒有辦法在不使用丟棄lambda函數的情況下做到這一點? 我已經搜索了Hoogle我認為簽名應該是什么( [a -> b] -> a -> [b] )沒有運氣。

你可以使用$運算符,它只是函數應用程序:

map ($ x) functions

(這預先假定x在表達式的范圍內。)

Hoogle只能找到函數,而不是任意表達式。 由於您正在使用map ,因此您希望搜索類似(a -> b) -> a -> b的函數,而不是任何涉及列表的函數。 給定一個正常的函數,將它傳遞給map使它在列表上起作用。

functions <*> pure x應該這樣做。 首先導入Control.Applicative模塊。

還要考慮這個:

Prelude Control.Applicative> [(1+),(2+)] <*> pure 4
[5,6]
Prelude Control.Applicative> [(1+),(2+)] <*> [4]
[5,6]
Prelude Control.Applicative> [(1+),(2+)] <*> [4,5]
[5,6,6,7]
Prelude Control.Applicative> [(+)] <*> [1,2] <*> [4,5]
[5,6,6,7]
Prelude Control.Applicative> (+) <$> [1,2] <*> [4,5]
[5,6,6,7]
Prelude Control.Applicative> getZipList $ ZipList [(1+),(2+)] <*> ZipList [4,5]
[5,7]
Prelude Control.Applicative> getZipList $ ZipList [(1+),(2+)] <*> pure 4
[5,6]

<$>只是fmap的同義詞。 <*>根據某種語義,將左邊的applicative functor中的“carry”應用到右邊的內容中。 對於裸列表,語義與列表monad相同 - 制作所有可能的組合 - 將左邊的每個函數應用到右邊的每個對象,並且pure x = [x] 對於標記為(即newtype d)作為ZipList的列表,語義是“zippery”應用程序 - 即一對一 ,而pure x = ZipList $ repeat x

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM