繁体   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