如何在具有 Pragma 依赖性的 ghci 中正确定义数据类型?
How to properly define a datatype in ghci with Pragma dependency?
我正在尝试根据 hammar 在 Haskell Map for Trees
中的回答在树类型上定义 fmap
他的定义derived functor,使用了pragma,我只是隐约熟悉。他的定义是
{-# LANGUAGE DeriveFunctor #-}
data Tree a = Leaf a | Node (Tree a) (Tree a)
deriving (Functor, Show)
我无法在 GHCI 中使用编译指示和定义。以下是我的三个错误尝试,如有任何反馈,我将不胜感激!
第一次尝试:
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’
第二次尝试:
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’
第三次尝试:
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’
在 GHCi 中,您 设置 pragma with :set
:
Prelude> :set -XDeriveFunctor
由于 data
子句跨越多行,您可以在 :{
和 :}
之间声明它:
Prelude> :{
Prelude| data Tree a = Leaf a | Node (Tree a) (Tree a)
Prelude| deriving (Functor, Show)
Prelude| :}
现在它应该可以工作了(在本地测试过)。例如,我们可以执行 fmap
:
Prelude> fmap (+1) (Node (Leaf 12) (Leaf 25))
Node (Leaf 13) (Leaf 26)
尝试失败的解释:
- 第一个失败是因为您的
data
子句跨越多行,因此您应该放在一行中,或者使用某种分组。然而,你没有启用pragma,所以这里有两个错误;
- 现在
data
子句没有问题,但是您不能启用这样的 pragma;和
- 编译指示又是问题所在。
我正在尝试根据 hammar 在 Haskell Map for Trees
中的回答在树类型上定义 fmap他的定义derived functor,使用了pragma,我只是隐约熟悉。他的定义是
{-# LANGUAGE DeriveFunctor #-}
data Tree a = Leaf a | Node (Tree a) (Tree a)
deriving (Functor, Show)
我无法在 GHCI 中使用编译指示和定义。以下是我的三个错误尝试,如有任何反馈,我将不胜感激!
第一次尝试:
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’
第二次尝试:
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’
第三次尝试:
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’
在 GHCi 中,您 设置 pragma with :set
:
Prelude> :set -XDeriveFunctor
由于 data
子句跨越多行,您可以在 :{
和 :}
之间声明它:
Prelude> :{
Prelude| data Tree a = Leaf a | Node (Tree a) (Tree a)
Prelude| deriving (Functor, Show)
Prelude| :}
现在它应该可以工作了(在本地测试过)。例如,我们可以执行 fmap
:
Prelude> fmap (+1) (Node (Leaf 12) (Leaf 25))
Node (Leaf 13) (Leaf 26)
尝试失败的解释:
- 第一个失败是因为您的
data
子句跨越多行,因此您应该放在一行中,或者使用某种分组。然而,你没有启用pragma,所以这里有两个错误; - 现在
data
子句没有问题,但是您不能启用这样的 pragma;和 - 编译指示又是问题所在。