Prelude位于 hackage.haskell.org 的基本包中,包含在每个 Haskell 文件中的隐式导入中,即找到翻转函数的位置。在右侧,您可以单击“源”并查看翻转的源代码。
flip :: (a -> b -> c) -> b -> a -> c
flip f x y = f y x
where 子句允许本地定义,x=10
或y="bla"
. 您还可以使用与顶层相同的语法在本地定义函数。add x y = x + y
在下面的等效公式中,我进行了替换g = f y x
flip :: (a -> b -> c) -> b -> a -> c
flip f x y = g
where
g = f y x
现在 g 没有参数。但是如果我们也定义了 gg a b = f b a
那么我们将会有:
flip :: (a -> b -> c) -> b -> a -> c
flip f x y = g x y
where
g a b = f b a
不,我们可以做一些代数抵消(如果你把它想象成数学课上的代数,你会很安全)。专注于:
flip f x y = g x y
取消每边的 y:
flip f x = g x
现在取消 x:
flip f = g
现在把它放回完整的表达式中:
flip :: (a -> b -> c) -> b -> a -> c
flip f = g
where
g a b = f b a
作为最后的修饰步骤,我们可以替换a
tox
和b
toy
以将函数恢复为参数名称:
flip :: (a -> b -> c) -> b -> a -> c
flip f = g
where
g x y = f y x
正如你所看到的,这个翻转的定义有点绕,我们在前奏中开始的内容很简单,是我更喜欢的定义。希望这有助于解释如何where
工作以及如何对 Haskell 代码进行一些代数操作。