1

我最近一直在从这个很棒的网站学习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

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

4

1 回答 1

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))))

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

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

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

于 2013-06-15T03:15:04.937 回答