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])没有运气.
您可以使用$运算符,它只是函数应用程序:
map ($ x) functions
Run Code Online (Sandbox Code Playgroud)
(这预示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]
Run Code Online (Sandbox Code Playgroud)
<$>只是一个同义词fmap.<*>根据某种语义,将左边的applicative functor中的"carry"应用到右边的内容中.对于裸列表,语义与列表monad相同 - 制作所有可能的组合 - 将每个函数从左侧应用到右侧的每个对象,和pure x = [x].对于标记为(即newtyped)为ZipLists的列表,语义是"zippery"应用程序 - 即一对一,和pure x = ZipList $ repeat x.