2011-10-07 86 views
6

在「仿函數,應用型函子幺」瞭解你的Haskell的章,米朗執行以下操作:GHC 7.0.4似乎已經忘記了如何申請函子

ghci> (pure 3) "blah" 
3 

然而,我得到這個:

ghci> (pure 3) "blah" 
<interactive>:1:2: 
    No instance for (Functor ((->) [Char])) 
     arising from a use of `pure' 
    Possible fix: 
     add an instance declaration for (Functor ((->) [Char])) 
    In the expression: (pure 3) "blah" 
    In an equation for `it': it = (pure 3) "blah" 

我不確定會發生什麼。直到現在,所有示例都正常運行。我不能輸入一些東西,但我不知道是什麼。

這裏是我的版本信息:

$ ghci -v 
GHCi, version 7.0.4: http://www.haskell.org/ghc/ :? for help 
Glasgow Haskell Compiler, Version 7.0.4, for Haskell 98, stage 2 booted by GHC version 6.12.3 

我的〜/ .ghc/ghci.conf看起來是這樣的:

{-# LANGUAGE Arrows #-} 

:set prompt "[32;1m%s[0m\n> " 

import Control.Arrow 
import Control.Monad (when, forever, forM, liftM) 
import Control.Applicative 
-- import Control.Applicative (ZipList (..), (<$>), (<*>), pure) 
import Control.Exception (IOException (..), catch) 
import qualified Data.ByteString as ByteString (pack, unpack) 
import qualified Data.ByteString.Lazy as LazyByteString (cons, cons', empty, fromChunks, pack, readFile, unpack, writeFile) 
import Data.Char (chr, ord, toUpper, toLower, isDigit) 
import Data.Function (fix, on) 
import Data.Functor 
import Data.List (find, genericLength, intercalate, intersperse, nub, tails) 
import Data.Map (Map (..)) 
import qualified Data.Map as Map (fromList, lookup) 
import Data.Monoid (mempty, mappend, mconcat) 
import Data.Tuple (fst, snd, curry, uncurry, swap) 
import System.Console.ANSI (setCursorPosition, clearScreen) 
import System.Directory (renameFile, doesFileExist) 
import System.Environment (getArgs, getProgName) 
import System.IO (IOMode (..), stdout, openFile, withFile, hGetContents, hClose, openTempFile, hPutStr, hFlush) 
import System.IO.Error (isDoesNotExistError) 
import System.Random (StdGen (..), RandomGen (..), Random (..), getStdGen, mkStdGen, newStdGen, random, randomR, randomRIO, randoms) 
import Text.Printf (PrintfArg (..), printf) 
+1

適合我... – Landei

+0

什麼版本的ghci是那個? –

+1

適用於使用「The Glorious Glasgow Haskell編譯系統,版本7.0.3」,從'Control.Applicative'輸入'pure'' –

回答

9

你錯過Control.Monad.Instances。不知道爲什麼它在那裏定義,但我也碰到過。

GHCi, version 7.0.4: http://www.haskell.org/ghc/ :? for help 
Loading package ghc-prim ... linking ... done. 
Loading package integer-gmp ... linking ... done. 
Loading package base ... linking ... done. 

Prelude Control.Applicative> (pure 3) "blah" 

<interactive>:1:2: 
    No instance for (Functor ((->) [Char])) 
     arising from a use of `pure' 
    Possible fix: 
     add an instance declaration for (Functor ((->) [Char])) 
    In the expression: (pure 3) "blah" 
    In an equation for `it': it = (pure 3) "blah" 
Prelude Control.Applicative> import Control.Monad.Instances 
Prelude Control.Applicative Control.Monad.Instances> (pure 3) "blah" 
3 

而且,看着LYAH章後,筆者確實定義上面的例子中的實例,但不是很明顯,這是已經在別處定義。

更新

錯誤是不是因爲ghci中忘記如何申請函子,而仿函數實例Functor ((->) [Char])尚未在您的環境中定義。

+0

工作!謝謝! –

+4

在一個真正的Haskell程序中,你不需要導入Control.Monad.Instances,這個實例必須在Control.Applicative中可見,所以它也應該在你的程序中可見。但是,由於ghci導入語法最近(相當)最近被擴展了,所以有一些bug。我認爲他們現在已經被壓扁了。 所以:這*不應該是必要的,但是是一個很好的解決方法。 –