【发布时间】:2021-09-21 03:02:08
【问题描述】:
我有这种数据类型:
data Arf a = Ser a [Arf a] deriving Show
当实例化 Functor 时,此代码有效:
instance Functor Arf where
fmap f [] = []
fmap f (Ser x xs) = Ser (f x) (map (fmap f) x)
为什么在Ser 的第二个参数中使用(map (fmap f) x) 而不是(fmap f x)?
【问题讨论】:
-
很遗憾您的代码不起作用。事实上
fmap f [] = []会抛出一个错误(除了 Fyodor Soikin 指出的错误)。请点击Edit 并更新您的问题。 -
您可以通过在 ghci 中运行
:set -XDeriveFunctor -ddump-deriv然后运行 data Arf a = Ser a [Arf a] deriving Functor来查看 ghc 如何写入Functor实例 -
fmap f []除了不进行类型检查之外完全是无关的。Arf只有一个构造函数(Ser),所以只定义一种情况。 没有没有“空”Arf a值。