gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 01:05:03 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com