haskell - 为什么我在 Functor 实例中遇到 GHC 无法匹配类型错误?

标签 haskell ghc functor

我正在尝试编写一个 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/

相关文章:

arrays - 由有界数据类型索引的 Repa 数组?

haskell - 鉴于 STG 生成自定义 ABI,Haskell 链接如何工作

haskell - 如何在 Haskell 中转储循环融合的结果?

scala - Functor、PointedFunctor、ApplicativeFunctor 和 Monad 的确切应用是什么?

haskell - 'fmapDefault' 中的 'Data.Traversable' 有什么意义?

haskell - Haskell 迷你语言

haskell - 如何将 IORef 与镜头配合使用?

haskell - 如何在 Haskell 中修复 "error: parse error on input ‘=’

performance - 如何提高 zipWith 在 Haskell 中的性能

haskell - 不是仿函数(或不可遍历)的可折叠示例?