我需要在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))
?
答案 0 :(得分:7)
正如错误消息所示,定义f
中的(.) f f = (\x -> f (f x))
定义存在冲突。您将名称f
绑定到(.)
的第一个和第二个参数,因此ghci
在评估表达式f x
时不知道要使用哪个参数。
使用模式(.)
定义(.) f g
,然后使用两个恰好相同的参数调用它时,没有任何问题。
答案 1 :(得分:7)
在Haskell中,函数的参数必须具有唯一的名称。不允许对另一个参数使用相同的名称。这是因为
foo x y = ... === foo = (\x-> (\y-> ...))
如果y
替换为x
,则第二个x
只会遮挡...
正文中的第一个:没有办法引用第一个x
{1}}从那里开始。
您可以定义twice f x = f (f x)
:
前奏> :t两次
两次::(t - > t) - > t - > t
前奏>两次(+1)4
6
或者,f (f x) = (.) f f x = join (.) f x
:
Prelude Control.Monad> :t join(。)
join(。)::(b - > b) - > b - > B'/ P>
join
在Control.Monad
中定义。对于函数,它包含join g x = g x x
。它也被称为W combinator。
E.g。 print $ join (.) (+1) 4
prints 6。