这是一个将参数应用于给定函数两次的高阶函数:
dapp :: (a -> a -> a) -> a -> a
dapp = \f x -> f x x
ghci> dapp (*) 5
25
我们可以缩短它吗?让我们问一下 lambdabot:
lambdabot> @pl \f x -> f x x
join
万岁!让我们试一试:
import Control.Monad (join)
dapp :: (a -> a -> a) -> a -> a
dapp = join
但它不起作用:(
No instance for (Monad ((->) a))
arising from a use of `join'
Possible fix: add an instance declaration for (Monad ((->) a))
In the expression: join
In an equation for `dapp': dapp = join
为什么会这样?我进口错了join
吗?join
我在 Hoogle 上找不到另一个。