gpt4 book ai didi

haskell - 翻转功能如何工作?

转载 作者:行者123 更新时间:2023-12-03 08:38:07 24 4
gpt4 key购买 nike

Haskell新手在这里。我正在通过 Learn you a haskell,遇到了翻转函数的定义。

flip' :: (a -> b -> c) -> (b -> a -> c)  
flip' f = g
where g x y = f y x

我不明白的是,x 和 y 是从哪里来的?我的意思是,签名告诉我 flip'是一个函数,它接受一个函数(有两个参数),并返回一个函数(同样,有两个参数)。

如果我理解这一点,当我编写一个类似的函数时
foo :: (a -> b) -> a -> b
foo f x = f x -- applies the function f on x

但是,在这种情况下,我明确地传递了参数 [ 即 x ] 所以我可以在函数体中访问它。那么 flip' 怎么来的?函数可以访问参数 x 和 y?

最佳答案

Prelude ,位于 base hackage.haskell.org 的包,包含在每个 Haskell 文件中的隐式导入中,其中 flip找到函数。在右侧您可以单击“来源”并查看source code for flip .

flip         :: (a -> b -> c) -> b -> a -> c
flip f x y = f y x

where 子句允许本地定义, x=10y="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 没有参数。但是如果我们将 g 定义为 g 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

作为最后的修饰步骤,我们可以进行替换 axby将函数恢复为参数名称:
flip     :: (a -> b -> c) -> b -> a -> c
flip f = g
where
g x y = f y x

正如你所看到的,这个翻转的定义有点绕,我们在前奏中开始的内容很简单,是我更喜欢的定义。希望有助于解释 where作品以及如何对 Haskell 代码进行一些代数操作。

关于haskell - 翻转功能如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14397128/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com