GHC 7.0.4似乎忘记了如何应用仿函数

Van*_*uel 6 haskell functor

在Learn You A Haskell的"Functors,Applicative Functors and Monoids"一章中,Miran执行以下操作:

ghci> (pure 3) "blah"
3
Run Code Online (Sandbox Code Playgroud)

但是,我得到了这个:

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"
Run Code Online (Sandbox Code Playgroud)

我不确定会发生什么.到目前为止,所有示例都正常工作.我一定不能进口东西,但我不知道是什么.

这是我的版本信息:

$ 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
Run Code Online (Sandbox Code Playgroud)

我的〜/ .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)
Run Code Online (Sandbox Code Playgroud)

Ada*_*ner 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
Run Code Online (Sandbox Code Playgroud)

此外,在查看LYAH中的章节之后,作者确实定义了示例上方的实例,但并不明显这已在其他地方定义过.

更新

错误不是因为ghci忘记了如何应用仿函数,而是Functor ((->) [Char])在您的环境中尚未定义Functor实例.

  • 在一个真正的Haskell程序中,您不需要导入`Control.Monad.Instances` - 该实例必须在`Control.Applicative`中可见,因此它也应该在您的程序中可见.但是,由于最近(相当)扩展了ghci导入语法,因此存在一些错误.我想他们现在已经被压扁了.所以:这*不应该*是必要的,但是一个很好的解决方法. (4认同)