【问题标题】:Pass multiple arguments to map's func argument将多个参数传递给 map 的 func 参数
【发布时间】:2015-06-29 17:12:23
【问题描述】:

在python中, 通过列表理解,我可以将多个参数传递给映射函数的函数参数,

  const = 2 
  def divide(x,y):
    return x/y
  [divide(x, const) for x in [2,4,6,8]]

如何在 haskell 中使用 map 函数做同样的事情?

类似的,

func x y = x/y

map (func x 2) [2 4 6 8]

我认为,可以使用函数柯里化来完成,但不确定正确的方法?

【问题讨论】:

    标签: list haskell


    【解决方案1】:

    使用部分

    您可以像这样使用 部分

    Prelude> let func x y = x / y
    Prelude> map (`func` 2) [2,4,6,8]
    [1.0,2.0,3.0,4.0]
    

    查看当您在 backticks 中编写函数时,您会将其变成运算符 - 然后您可以将值插入到左侧或右侧(此处为 xy) .

    如果您想替换x,那么您也可以使用普通部分应用程序:

    Prelude> map (func 24) [2,4,6,8]
    [12.0,6.0,4.0,3.0]
    

    相同
    Prelude> map (24 `func`) [2,4,6,8]
    [12.0,6.0,4.0,3.0]
    

    使用 lambda

    当然,如果您根本不喜欢这个,您可以随时使用 lambda:

    Prelude> map (\x -> func x 2) [2,4,6,8]
    [1.0,2.0,3.0,4.0]
    

    使用列表理解

    或者您可以像在 Python 中那样做同样的事情(使用列表推导式):

    Prelude> [ func x 2 | x <- [2,4,6,8] ]
    [1.0,2.0,3.0,4.0]
    

    好吧,我想我现在想不出其他(简单)的了;)

    通过flip 使用部分应用程序

    flip 和部分应用程序(我觉得可读性差一些 - 但我觉得有点好笑;):

    Prelude> map (flip f 2) [2,4,6,8]
    [1.0,2.0,3.0,4.0]
    

    备注/div

    由于您在这里只处理了Ints,您可能希望使用div 而不是(/)

    Prelude> map (`div` 2) [2,4,6,8]
    [1,2,3,4]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-02
      • 1970-01-01
      相关资源
      最近更新 更多