传递具有任意数量参数的函数

时间:2013-06-15 03:09:43

标签: function haskell parameters parameter-passing

我最近一直在学习来自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

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

1 个答案:

答案 0 :(得分:8)

实际上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))))

前两个参数被翻转。 a abbcc -> d -> (a, b, c, d)printf

然后再说一遍,你希望通过翻转一个3参数函数来实现这个目标吗?

编辑:还有vararg函数 - 一个例子是{{1}}。 This Haskell.org页面非常好。简而言之,可以使用一些类型类魔法来实现这种效果。