haskell - Haskell 中的旋转参数

标签 haskell functional-programming rotation

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/

相关文章:

haskell - do-notation 是特定于 "base:GHC.Base.Monad"的吗?

haskell - 堆栈没有正确解决依赖关系

arrays - 在 Swift 中,如何按类过滤符合协议(protocol)的对象数组?

typescript - 来自 fp-ts 和 URI 的 typescript 中更高种类的类型

c# - 如何使用 itextsharp 库旋转 pdf

haskell - 规范化函数而不在 Haskell 中实际应用它

functional-programming - Erlang 真的是一种函数式语言吗?

android - 用于旋转相机 Intent 捕获的图像的代码在 Android 中不起作用

c - 旋转时点正在到达原点

Haskell 的类型关联链令人费解