将`apply`映射到函数列表

时间:2014-04-16 02:05:15

标签: haskell

Learn You a Haskell演示了与currying的映射:

*Main> let xs = map (*) [1..3]

xs现在等于[(1 *),(2 *),(3 *)]

已审核以按照Antal S-Z的评论更正订单。

我们可以获取列表中的第一项,并将3应用于它 - 返回3 * 1.

*Main> (xs !! 0) 3
3

但是,如何应用以下foo1应用于xs中的所有curried函数?

*Main> let foo = 1
*Main> map foo xs

<interactive>:160:5:
    Couldn't match expected type `(Integer -> Integer) -> b0'
                with actual type `Integer'
    In the first argument of `map', namely `foo'
    In the expression: map foo xs
    In an equation for `it': it = map foo xs

期望的输出:

[1, 2, 3]

3 个答案:

答案 0 :(得分:8)

使用($)功能...

Prelude> :t ($)
($) :: (a -> b) -> a -> b

...只传递第二个参数。

Prelude> let foo = 2
Prelude> map ($ foo) [(1*), (2*), (3*)]
[2,4,6]

答案 1 :(得分:5)

您是否尝试过使用applicative functors

import Control.Applicative

main = (*) <$> [1,2,3] <*> pure 1

<$>函数与中缀形式的fmap相同。它有类型签名:

(<$>) :: Functor f => (a -> b) -> f a -> f b

<*>函数是$(函数应用程序)的仿函数:

(<*>) :: Applicative f => f (a -> b) -> f a -> f b

对于monad,pure函数类似于return。它需要一个正常值并返回一个applicative functor:

pure :: Applicative f => a -> f a

因此,表达式(*) <$> [1,2,3] <*> pure 1类似于将(*)函数应用于[1,2,3]pure 1的所有值。由于pure 1只有一个值,因此相当于将列表中的每个项目与1相乘以生成新的产品列表。

答案 2 :(得分:1)

或者你可以使用匿名函数:

map (\x -> x foo) xs