Haskell 无法使用函子构造无限类型

Haskell 无法使用函子构造无限类型,haskell,functor,Haskell,Functor,我试图为以下类型定义Functor、Applicative和Monad的实例: data BTree a=Leaf a | Node (BTree a) (BTree a) deriving (Eq,Show) 我已经尝试过像这样实现Functor实例: instance Functor BTree where fmap f (Leaf t) =Leaf (f t) fmap f (Node a b) =Node (f a) (f b) 什么起作用了 f

我试图为以下
类型定义
Functor
Applicative
Monad
的实例:

 data BTree a=Leaf a | Node  (BTree a) (BTree a) deriving (Eq,Show)
我已经尝试过像这样实现
Functor
实例:

 instance Functor BTree where
        fmap f (Leaf t) =Leaf (f t)
        fmap f (Node a b) =Node (f a) (f b)
什么起作用了

fmap f (Node a b)=Node (fmap f a) (fmap f b)
我理解这是不正确的,因为作为
functor
的一个实例,表单必须被保留
fa
->
fb
(在我们的例子中是
节点
)。 在我的实现中,您将得到
fa->b

我不明白的是:

为什么它是无限类型?
考虑到
节点(fa)(fb)
在层次结构的某个地方,子
节点将是
,我将对其应用
f

它是一个无限类型,因为在这种情况下,我们将
f::(a->b)
应用于类型为
BTree a
的左右子树


这迫使
a
b树a
相同,这要求
a
是一个无限类型(记录在案,您可以定义为
Fix BTree
,其中
Fix f=Fix(f(Fix f))
,这可能有用,但不是您想要的!)

它是一个无限类型,因为在这种情况下,我们将
f::(a->b)
应用于类型为
b树a
的左右子树


这迫使
a
b树a
相同,这要求
a
是一个无限类型(为了记录,您可以定义为
Fix BTree
,其中
Fix f=Fix(f(Fix f))
,这可能有用,但不是您想要的!)您正试图将
f
应用于
a
类型的值(在
Leaf(ft)
中)和
BTree a
类型的值(在
节点(fa)(fb)
)。为此,类型检查器需要找到某种方法来统一
a
BTree a
,这只有在
a
BTree
类型的无限嵌套堆栈时才可能;在
a
上再添加一层
BTree
并不能有效地改变它


Node(fa)(fb)
更改为
Node(fmap fa)(fmap fb)
可确保
f
仅应用于
a
类型的值
f
您试图将
f
应用于
a
类型的值(在
Leaf(ft)
中)和
BTree a
类型的值(在
节点(fa)(fb)中)。为此,类型检查器需要找到某种方法来统一
a
BTree a
,这只有在
a
BTree
类型的无限嵌套堆栈时才可能;在
a
上再添加一层
BTree
并不能有效地改变它

节点(f a)(f b)
更改为
节点(fmap f a)(fmap f b)
可确保
f
仅应用于
a
类型的值