例如,键入:t apGHCi会得到结果
ap :: Monad m => m (a -> b) -> m a -> m b
Run Code Online (Sandbox Code Playgroud)
如果我已经知道我要使用的Monad实例,我((->) r)该如何查询ap该特定实例的类型?
这是一个高阶函数,它将一个参数应用于给定函数两次:
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 …Run Code Online (Sandbox Code Playgroud)