[英]Haskell - How to write (.) f f = (\x -> f (f x))
我需要在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不理解(.) ff = (\\x -> f (fx))
?
正如错误消息所示,您在定义(.) ff = (\\x -> f (fx))
对f
的定义存在冲突。 您将名称f
绑定到(.)
的第一个和第二个参数,因此ghci
在计算表达式fx
时不知道要使用哪个参数。
定义(.)
使用模式(.) fg
,然后用两个恰好相同的参数调用它没有错。
在Haskell中,函数的参数必须具有唯一的名称。 不允许对另一个参数使用相同的名称。 这是因为
foo x y = ... === foo = (\x-> (\y-> ...))
如果y
替换为x
,则第二个x
只会遮挡...
body中的第一个:没有办法从那里引用第一个x
。
你可以定义twice fx = f (fx)
:
前奏>:t两次
两次::(t - > t) - > t - > t
前奏>两次(+1)4
6
或者, f (fx) = (.) ffx = join (.) fx
:
Prelude Control.Monad>:t join(。)
join(。)::(b - > b) - > b - > b
join
在Control.Monad
定义。 对于函数,它认为join gx = gxx
。 它也被称为W组合器 。
例如, print $ join (.) (+1) 4
打印6 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.