我正在尝试编写一个 Functor 实例:
module TreeN where
data TreeN a = LeafN a | ParentN a [TreeN a] deriving (Eq, Show)
instance Functor TreeN where
fmap f (LeafN x) = LeafN (f x)
fmap f (ParentN x children) = (ParentN (f x) (TreeN.fmap f children))
我得到这个错误:
src/TreeN.hs:7:1: error:
• Couldn't match type ‘TreeN t’ with ‘[TreeN t]’
Expected type: (t -> a) -> [TreeN t] -> [TreeN a]
Actual type: (t -> a) -> TreeN t -> TreeN a
• Relevant bindings include
fmap :: (t -> a) -> [TreeN t] -> [TreeN a]
(bound at src/TreeN.hs:7:1)
|
7 | fmap f (LeafN x) = LeafN (f x)
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
Failed, no modules loaded.
GHC 认为我想将 fmap 的输入和输出包装在另一层结构中,这对我来说是个谜。
我也试过拼写这个:
map :: (a -> b) -> f a -> f b
但这会导致不同的错误。我无法判断 GHC 是否因为两次看到相同的东西而出错,或者您是否应该对此明确说明并明确说明它会暴露其他一些问题。
我做错了什么?
最佳答案
您的 parentN
有一个TreeN
的列表,因此您需要对所有子节点执行映射:
instance Functor TreeN where
fmap f (LeafN x) = LeafN (f x)
fmap f (ParentN x children) = ParentN (f x) (<strong>map (fmap f)</strong> children)
Functor
的实现是“标准”实现,您可以使用 DeriveFunctor
language extension并与:
{-# LANGUAGE <strong>DeriveFunctor</strong> #-}
data TreeN a = LeafN a | ParentN a [TreeN a] deriving (Eq, <strong>Functor</strong>, Show)
关于haskell - 为什么我在 Functor 实例中遇到 GHC 无法匹配类型错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71184578/