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

时间:2014-09-22 03:20:29

标签: 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))

2 个答案:

答案 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>

joinControl.Monad中定义。对于函数,它包含join g x = g x x。它也被称为W combinator

E.g。 print $ join (.) (+1) 4 prints 6