我正在嘗試撰寫一個 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 是否因為兩次看到相同的東西而出錯,或者您是否應該對此明確表示并且明確表示它會暴露其他問題。
我究竟做錯了什么?
uj5u.com熱心網友回復:
您parentN有一個s串列,TreeN因此您需要對所有子項執行映射:
instance Functor TreeN where
fmap f (LeafN x) = LeafN (f x)
fmap f (ParentN x children) = ParentN (f x) (map (fmap f) children)
但是,您的實作Functor是“標準”實作,您可以使用DeriveFunctor語言擴展并使用:
{-# LANGUAGE DeriveFunctor #-}
data TreeN a = LeafN a | ParentN a [TreeN a] deriving (Eq, Functor, Show)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/434067.html
