2013-04-22 60 views
4

這是一種將高階函數的參數給定函數兩次:lambdabot建議加入,但它不工作

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

ghci> dapp (*) 5 
25 

我們可以作出這樣的短?讓我們來問一下:

lambdabot> @pl \f x -> f x x 
join 

Hooray!讓我們來嘗試一下:

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

?。
+7

只要導入'Control.Monad.Instances' - 我認爲那個實例在那裏。 – 2013-04-22 20:02:04

+2

@Thomas如何有選擇地只導入Monad(( - >)r)'實例? – fredoverflow 2013-04-22 20:04:39

+6

@FredOverflow不能有選擇地導入實例。您可以'導入Control.Monad.Instances()',它將導入所有實例,而不是其他任何東西。 – 2013-04-22 20:05:39

回答

10

Until recently,爲(->) rFunctorMonad實例中Control.Monad.Instancesorphan instances

但是,從base-4.6.0.0(GHC 7.6.1)開始,這些實例已移至Prelude和(現在爲空)Control.Monad.Instanceshas been deprecated

因此,要使用這些實例,請輸入Control.Monad.Instances或升級您的GHC。

+0

謝謝哈馬爾,我不知道他們已經搬家了。 – 2013-04-22 22:50:10

+0

@ ThomasM.DuBuisson:我也沒有。因爲某些原因,[GHC 7.6.1發佈說明](http://www.haskell.org/ghc/docs/7.6.1/html/users_guide/釋放-7-6-1.html#id9281219)。 – hammar 2013-04-22 23:01:42