【问题标题】:passing a function with an arbitrary amount of parameters传递具有任意数量参数的函数
【发布时间】:2013-06-15 03:09:43
【问题描述】:

我最近一直在向this awesome site 学习haskell,我刚刚在高阶函数一章中了解了将函数作为参数传递。我可以看到将函数作为参数传递是非常有用的,但根据我目前(lowley)的理解,您需要指定此函数中的参数数量,鉴于此函数,这可能非常有限:

--takes a function and returns a function that has flipped arguments
flip' :: (a -> b -> c) -> (b -> a -> c) --very limited
flip' f = g
    where g x y = f y x

有用,但仅限于带有两个参数的函数,有没有办法编写一个函数定义来接受具有任意数量参数的函数?我的猜测必须是某种参数列表,但我似乎找不到任何信息。谢谢!

【问题讨论】:

  • 为了更快地进入主题:永远记住,每个 Haskell 函数都只有 一个参数!你的双参数函数只是将第一个参数映射到另一个函数的柯里化函数,没有理由不能继续任意数字; flip 不在乎。

标签: function haskell parameters parameter-passing


【解决方案1】:

实际上flip 可用于具有两个以上参数的函数,但可能不是您所需要的:

Prelude> :t (,,,)
(,,,) :: a -> b -> c -> d -> (a, b, c, d)
Prelude> :t flip (,,,)
flip (,,,) :: b -> a -> c -> d -> (a, b, c, d)

因为

(,,,) :: a -> b -> c -> d -> (a, b, c, d)

(,,,) :: a -> (b -> (c -> (d -> (a, b, c, d))))

前两个参数被翻转。这里aabb,但cc -> d -> (a, b, c, d)

再一次,你希望通过翻转这个例子中的 3 参数函数来实现什么?

编辑:而且,还有可变参数函数——一个例子是printfThisHaskell.org 页面非常好。简而言之,可以使用一些类型类魔法来实现这种效果。

【讨论】:

  • 我并不是专门寻找一个允许我翻转的解决方案,而是更多关于如果有办法我如何创建这样的功能。
  • @Gmercer015:已编辑。 printf 在我第一次读到它的时候让我大吃一惊,所以这可能不像在其他语言中看起来那么简单,但绝对是优雅的,不需要 hack。我认为这不适合您正在阅读的 LYAH 部分 - 它可能应该在以后,而且我认为该教程中从未提及它。
  • @Gmercer015 你已经创建了这样一个函数。您在问题中写的翻转将适用于任何需要至少两个参数的函数。如果您不相信我,请在三个参数的函数上尝试您的 flip'
  • @Gmercer015 不,您的flip' 适用于三个参数的函数。如果您不相信我,请立即尝试。
  • @Gmercer015 是的,诀窍在于意识到flip' 的类型签名中的c 本身可以是更多参数的函数。
猜你喜欢
  • 1970-01-01
  • 2021-03-28
  • 2017-12-18
  • 1970-01-01
  • 1970-01-01
  • 2022-06-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多