【问题标题】:Using map with function that has multiple arguments将 map 与具有多个参数的函数一起使用
【发布时间】:2018-12-06 23:37:16
【问题描述】:

是否可以将 map 与带有多个参数的函数一起使用?

我想重复使用 map 的第二个和第三个参数作为函数的参数。 如

mapF x y z = map (f y z) [1, 2, 3]

因此,它将使用相同的 yz 值评估 f,但使用 x = 1x = 2x = 3 等等。

【问题讨论】:

  • 使用 lambda:map (\x -> f x y z) [1, 2, 3]

标签: list haskell higher-order-functions map-function partial-application


【解决方案1】:

您应该使用 lambda 函数,要查看它的工作原理,让我们从使用辅助函数将 f 映射到某个列表开始。

map helper [1, 2, 3] where
  helper x = f x y z

在 Haskell 中,函数有两种语法,所以让我们使用 lambda 语法来定义我们的辅助函数:

map helper [1, 2, 3] where
  helper = \x -> f x y z

使用 lambda 语法,我们不需要给我们的辅助函数一个明确的名字,它可以是一个我们映射到输入的匿名函数

map (\x -> f x y z) [1, 2, 3]

所以现在你可以说

mapF y z = map (\x -> f x y z) [1,2,3]

但大概你不希望x 是 1、2 和 3,你希望它是一个列表 你作为参数传递给mapF。所以你需要给它一个不同的名字:

mapF xs y z = map (\x -> f x y z) xs

Haskell 约定使用s 作为保存列表或其他容器的变量的后缀。所以如果一个值是x,那么它们的列表就是xs

【讨论】:

    【解决方案2】:

    保证会有更好的方法来做到这一点(仍在学习),但您可以:

    f' = map f [1,2,3]
    

    f' 现在是部分应用的f 列表

    g y z= map (\h -> h y z) f'
    

    将获取这些函数中的每一个并在参数 y z 上运行它。

    您可以在一行中破解所有内容。

    【讨论】:

    • 我不明白。 f 不能只使用一个参数。
    • Haskell 非常好,只应用了部分函数,​​它只是创建了一个需要更多参数的函数。例如,如果您说 f = (2+) 生成的函数需要另一个参数,因此 f 6 = 8、f 10 = 12 等。
    • 我确认这是可行的,但我认为 Bi Rico 的回答更简单直观。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-07
    • 2016-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-19
    • 1970-01-01
    相关资源
    最近更新 更多