这是一个高阶函数,它将一个参数应用于给定函数两次:
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
吗?我在Hoogle上找不到另一个join
。
答案 0 :(得分:10)
Until recently,Functor
的{{1}}和Monad
个实例(->) r
中的orphan instances {/ 3}}。
但是,从Control.Monad.Instances
(GHC 7.6.1)开始,这些实例已移至Prelude和(现在为空)base-4.6.0.0
has been deprecated。
因此,要使用这些实例,请导入Control.Monad.Instances
或升级GHC。