我最近一直在学习来自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
很有用,但只有两个参数的函数,是否有办法编写一个函数定义,接受具有任意数量参数的函数?我的猜测必须是某种参数列表,但我似乎无法找到任何信息。谢谢!
答案 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
a
为b
,b
为c
,c -> d -> (a, b, c, d)
为printf
。
然后再说一遍,你希望通过翻转一个3参数函数来实现这个目标吗?
编辑:还有vararg函数 - 一个例子是{{1}}。 This Haskell.org页面非常好。简而言之,可以使用一些类型类魔法来实现这种效果。