我有这个简单的ADT:自定义函子实例:期望一种 '* - > *',而是 'AST' 有种 '*'
data AST = Node String [AST]
| Leaf String
| Empty
deriving (Show)
和函子实例:
instance Functor AST where
fmap f (Node s l) = Node (f s) (fmap f l)
fmap f (Leaf s) = Leaf (f s)
fmap f Empty = Empty
但是,当我尝试编译它,我得到这个错误,我完全不明白:
Expected kind ‘* -> *’, but ‘AST’ has kind ‘*’
• In the first argument of ‘Functor’, namely ‘AST’
In the instance declaration for ‘Functor AST’
有谁知道为什么会这样?我无法在互联网上找到解决方案。
作为一个健全性检查,这个实例'fmap'实际上做了什么吗? 'Functor'实例包含可以“映射”的事物,但AST中没有数据这样的可映射数据。 – jozefg
应该注意的是,在这里'AST'和'fmap'定义构成了一个完全合理的分类仿函数,即使它们没有生成有效的Haskell'Functor'。 – pigworker