2011-10-07 9 views
6

Nelle "Funtori, applicativi funtori e monoidi" Capitolo delle Imparare You A Haskell, Miran esegue le seguenti operazioni:GHC 7.0.4 sembra aver dimenticato come applicare funtori

ghci> (pure 3) "blah" 
3 

Io però ottenere questo:

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" 

Non so cosa succederà. Tutti gli esempi hanno funzionato correttamente fino ad ora. Non devo aver importato qualcosa, ma non so cosa.

Ecco il mio informazioni sulla versione:

$ 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 

mio ~/.ghc/ghci.conf appare così:

{-# 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

Funziona per me ... – Landei

+0

Che versione di ghci è? –

+1

Lavora per me utilizzando "The Glorious Glasgow Haskell Compilation System, versione 7.0.3", con 'pure' importato da' Control.Applicative' –

risposta

9

Stai perdendo Control.Monad.Instances. Non sono sicuro del motivo per cui è stato definito lì, ma mi sono imbattuto in questo prima pure.

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 

Inoltre, dopo aver guardato il capitolo in Lyah, l'autore non definire l'istanza di cui sopra l'esempio, ma non è evidente che questo è già definito altrove.

Aggiornamento

L'errore non è stato perché ghci dimenticato come applicare funtori, piuttosto l'istanza Functor Functor ((->) [Char]) non è stato ancora definito nel proprio ambiente.

+0

che ha funzionato !!! grazie! –

+4

In un vero programma Haskell non è necessario importare 'Control.Monad.Instances' - l'istanza deve essere visibile in' Control.Applicative', quindi dovrebbe essere visibile anche nel programma. Tuttavia, poiché la sintassi di importazione di ghci è stata (abbastanza) recentemente estesa, c'erano un paio di bug in esso. Penso che siano stati schiacciati ormai. Quindi: questo * non dovrebbe * essere necessario, ma è una buona soluzione. –