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