如何使用Pragma依赖关系在ghci中正确定义数据类型?

War*_*lan 3 haskell ghci

我正在尝试在Haskell Map for Trees中的 hammar答案中定义一个Tree类型的fmap

他的定义来自functor,它使用了pragma,我只是模糊地熟悉它.他的定义是

{-# LANGUAGE DeriveFunctor #-}
data Tree a = Leaf a | Node (Tree a) (Tree a)
    deriving (Functor, Show)
Run Code Online (Sandbox Code Playgroud)

我无法在GHCI中使用pragma和定义.以下是我的三次错误尝试,我将不胜感激任何反馈!

第一次尝试:

Prelude> {-# LANGUAGE DeriveFunctor #-}
Prelude> data Tree a = Leaf a | Node (Tree a) (Tree a)
Prelude>     deriving (Functor, Show)
<interactive>:30:5: parse error on input ‘deriving’
Run Code Online (Sandbox Code Playgroud)

第二次尝试:

Prelude> {-# LANGUAGE DeriveFunctor #-}
Prelude> data Tree a = Leaf a | Node (Tree a) (Tree a) deriving (Functor, Show)
<interactive>:32:57:
    Can't make a derived instance of ‘Functor Tree’:
  You need DeriveFunctor to derive an instance for this class
In the data declaration for ‘Tree’
Run Code Online (Sandbox Code Playgroud)

第三次尝试:

Prelude> :{
Prelude| {-# LANGUAGE DeriveFunctor #-}
Prelude| data Tree a = Leaf a | Node (Tree a) (Tree a)
Prelude|     deriving (Functor, Show)
Prelude| :}
<interactive>:35:1: parse error on input ‘data’
Run Code Online (Sandbox Code Playgroud)

Wil*_*sem 6

在GHCI你设定编译使用:set:

Prelude> :set -XDeriveFunctor
Run Code Online (Sandbox Code Playgroud)

由于该data子句跨越多行,您可以在:{和之间声明它:}:

Prelude> :{
Prelude| data Tree a = Leaf a | Node (Tree a) (Tree a)
Prelude|     deriving (Functor, Show)
Prelude| :}
Run Code Online (Sandbox Code Playgroud)

现在它应该工作(在本地测试).例如,我们可以执行fmap:

Prelude> fmap (+1) (Node (Leaf 12) (Leaf 25))
Node (Leaf 13) (Leaf 26)
Run Code Online (Sandbox Code Playgroud)

尝试失败的说明:

  1. 第一个失败,因为你的data子句跨越多行,所以你应该放在一行,或使用某种分组.不过,你没有启用编译指示,所以这里有两个错误;
  2. 现在这个data子句没有问题,但你不能像这样启用一个pragma; 和
  3. 再一次,pragma是问题.