4

以下は、指定された関数に引数を 2 回適用する高階関数です。

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

ghci> dapp (*) 5
25

それを短くすることはできますか?ラムダボットに聞いてみましょう:

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た。

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 に答える