lambdabot建议加入,但它不起作用

fre*_*low 4 monads haskell join higher-order-functions lambdabot

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

dapp :: (a -> a -> a) -> a -> a
dapp = \f x -> f x x

ghci> dapp (*) 5
25
Run Code Online (Sandbox Code Playgroud)

我们可以缩短它吗?我们问lambdabot:

lambdabot> @pl \f x -> f x x
join
Run Code Online (Sandbox Code Playgroud)

万岁!我们来试试吧:

import Control.Monad (join)

dapp :: (a -> a -> a) -> a -> a
dapp = join
Run Code Online (Sandbox Code Playgroud)

但它不起作用:(

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
Run Code Online (Sandbox Code Playgroud)

为什么会这样?我输错了join吗?join在Hoogle上我找不到另一个.

ham*_*mar 10

直到最近,在FunctorMonad对实例(->) r孤儿的实例Control.Monad.Instances.

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

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