Haskell 中的 flip
函数用于交换函数前两个参数的位置:
flip :: (a -> b -> c) -> b -> a -> c
flip f y x = f x y
类似地,我们可以编写一个函数来旋转三个参数:
rot :: (a -> b -> c -> d) -> b -> c -> a -> d
rot f y z x = f x y z
这个概念可以扩展到柯里化(Currying)任意数量参数的函数吗?
给定一个类型为 a -> ... -> z
的函数,是否可以编写以下类型的函数?
(a -> ... -> z) -> ... -> a -> z
我知道 ->
运算符是右结合的。因此 ... -> z
无法拆分。尽管如此,我还是想确切地知道。
最佳答案
你是对的,你不能这样做。您必须对任意数量的参数进行模式匹配,但没有办法做到这一点。
您可以使用 Template Haskell 为不同的数量生成一组旋转函数,但您总是必须提前决定生成多少个,而且它不是真正的通用函数,只是编写它们的快捷方式.
如果你的函数碰巧将它们的参数作为列表(eew),你可以做类似的事情,但这也有一个明显的缺点,即要求参数类型是同质的。
关于haskell - Haskell 中的旋转参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15407117/