4

这是一个将参数应用于给定函数两次的高阶函数:

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 上找不到另一个。

4

1 回答 1

10

直到最近Functor和的Monad实例(->) r都是.Control.Monad.Instances

但是,从base-4.6.0.0(GHC 7.6.1) 开始,这些实例已移至 Prelude 并且(现在为空)Control.Monad.Instances 已弃用

因此,要使用这些实例,请导入Control.Monad.Instances或升级您的 GHC。

于 2013-04-22T22:04:18.790 回答