gpt4 book ai didi

Haskell - 如何写 (.) f f = (\x -> f (f x))

转载 作者:行者123 更新时间:2023-12-02 16:05:19 24 4
gpt4 key购买 nike

我需要编写一个要在 GHCi 上运行的模块,并将函数组合为相同的函数。这个(经典的fog(x) = f(g(x)))运行:

(.) f g = (\x -> f (g x)). 

当我尝试这样写时出现问题

(.) f f = (\x -> f (f x)).   (fof(x) = f(f(x)))

GHCi 说:

"Conflicting definitions for `f'
Bound at: Lab1.hs:27:9
Lab1.hs:27:12"

第 27:9 行第一次出现 f,第 27:12 行再次出现 f。

为什么 Haskell 不理解 (.) f f = (\x -> f (f x))

最佳答案

在 Haskell 中,函数的参数必须具有唯一的名称。不允许对另一个参数使用相同的名称。这是因为

foo x y = ...    ===    foo = (\x-> (\y-> ...))

如果 y替换为 x ,第二个x只会隐藏 ... 中的第一个body:无法引用第一个 x从那里开始。

您可以只定义twice f x = f (f x) :

Prelude> :t twice
twice :: (t -> t) -> t -> t
Prelude> twice (+1) 4
6

<小时/>

或者,f (f x) = (.) f f x = join (.) f x :

Prelude Control.Monad> :t join (.)
join (.) :: (b -> b) -> b -> b

join定义于 Control.Monad 。对于函数来说,join g x = g x x 。它也称为 W combinator .

例如print $ join (.) (+1) 4 prints 6 .

关于Haskell - 如何写 (.) f f = (\x -> f (f x)),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25966257/

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