Haskell:映射函数应用程序

Dan*_*ter 3 lambda haskell pointfree

我在Haskell中进行的一些计算的一部分导致映射Float到的函数列表Float.我想对所有这些函数应用一个参数,如下所示:

-- x :: Float
-- functions :: [Float -> Float]
map (\f -> f x) functions
Run Code Online (Sandbox Code Playgroud)

有没有办法在不使用丢弃lambda函数的情况下做到这一点?我已经搜索了Hoogle,我认为签名应该是([a -> b] -> a -> [b])没有运气.

Tik*_*vis 9

您可以使用$运算符,它只是函数应用程序:

map ($ x) functions
Run Code Online (Sandbox Code Playgroud)

(这预示x着表达的范围.)

Hoogle只能找到函数,而不是任意表达式.既然你正在使用map,你想要搜索一个函数,(a -> b) -> a -> b而不是任何涉及列表的函数.给定一个正常的函数,传递它map使它在列表上行动.

  • 运算符的定义非常简单:`f $ x = fx`.所以它实际上只是功能应用,作为运营商.当你部分应用它时,你得到的东西相当于`\ f - > f $ x`; 使用上面的定义,这适用于`\ f - > fx`,这正是你所拥有的. (2认同)

Wil*_*ess 6

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]
Run Code Online (Sandbox Code Playgroud)

<$>只是一个同义词fmap.<*>根据某种语义,将左边的applicative functor中的"carry"应用到右边的内容中.对于裸列表,语义与列表monad相同 - 制作所有可能的组合 - 将每个函数从左侧应用到右侧的每个对象,和pure x = [x].对于标记为(即newtyped)为ZipLists的列表,语义是"zippery"应用程序 - 即一对一,和pure x = ZipList $ repeat x.

  • 这些函数实际上是为applicative functor而不是monad定义的.应用程序更为通用 - 所有monad也是应用程序,但反之亦然. (2认同)