[英]Haskell: mapping function application
一些計算,我在Haskell做的部分導致的映射函數列表Float
到Float
。 我想對所有這些函數應用一個參數,如下所示:
-- 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.