我需要编写一个要在 GHCi 上运行的模块,并将函数组合为相同的函数。这个(经典fog(x) = f(g(x))
) runs:
(.) 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。
为什么哈斯克尔不明白(.) f f = (\x -> f (f x))
?
在 Haskell 中,函数的参数必须具有唯一的名称。不允许对另一个参数使用相同的名称。这是因为
foo x y = ... === foo = (\x-> (\y-> ...))
and if y
替换为x
, 第二x
只会遮蔽第一个里面的...
body:无法引用第一个x
从那里。
你可以只定义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 (.)
连接 (.) :: (b -> b) -> b -> b
join
定义于Control.Monad
。对于函数,则认为join g x = g x x
。它也被称为W组合器 https://stackoverflow.com/a/11050971/849891.
E.g. print $ join (.) (+1) 4
prints 6 http://ideone.com/xuxLGk.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)