Haskell - 如何写(.)ff =(\ x - > f(fx))

m4v*_*ick 2 math haskell calculus ghci

我需要在GHCi上运行一个模块,并将函数组合到同一个函数中.这(经典fog(x) = f(g(x)))运行:

(.) f g = (\x -> f (g x)). 
Run Code Online (Sandbox Code Playgroud)

当我尝试像这样写它时出现问题

(.) f f = (\x -> f (f x)).   (fof(x) = f(f(x)))
Run Code Online (Sandbox Code Playgroud)

GHCi说:

"Conflicting definitions for `f'
 Bound at: Lab1.hs:27:9
           Lab1.hs:27:12"
Run Code Online (Sandbox Code Playgroud)

第27:9行出现在第一次f,行27:12再次出现f.

为什么Haskell不了解(.) f f = (\x -> f (f x))

sjy*_*sjy 7

如错误消息所示,定义f中的定义存在冲突(.) f f = (\x -> f (f x)).您将名称绑定f到第一个和第二个参数(.),因此ghci在计算表达式时不知道要使用哪个参数f x.

定义(.)使用模式(.) f g,然后使用恰好相同的两个参数调用它没有任何问题.


Wil*_*ess 7

在Haskell中,函数的参数必须具有唯一的名称.不允许对另一个参数使用相同的名称.这是因为

foo x y = ...    ===    foo = (\x-> (\y-> ...))
Run Code Online (Sandbox Code Playgroud)

如果y替换为x,第二个x只会影响...身体内的第一个:没有办法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(.)
join(.)::(b - > b) - > b - > b

join定义于Control.Monad.对于功能,它认为join g x = g x x.它也被称为W组合器.

例如print $ join (.) (+1) 4 打印6.