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

标签 haskell math ghci calculus

我需要编写一个要在 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/

相关文章:

haskell - 是否建议以尾递归形式使用递归IO操作?

math - 如何为高斯过程(GP)选择合适的内核?

algorithm - 你如何确定是否可以围绕一组点画一个圆圈,这样另一组点不在圆圈内?

haskell - 为什么我不能用 Haskell 端口号中相同值的变量替换某个值?

debugging - 将 where 子句纳入 GHCi 调试器的范围

haskell - haskell 中定义类型的树

c# - 如何从与球体相切的点 P 中随机找到向量之一

haskell - 如何从 GHCi 中启用语言扩展?

haskell - ghci 'Not in scope:' 消息

haskell - 具有状态更新的状态相关事件处理