[英]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.