可以部分应用函子吗
Can one partially apply functor
我正在尝试为以下类型实施 fmap
:
data Tree a = Leaf a | Node a (Tree a) (Tree a) | Empty deriving (Eq,Show)
instance Functor Tree where
fmap _ Empty=Empty
fmap f (Leaf x)=Leaf (f x)
fmap f (Node t left right)=Node (f t) left right
我不断收到类型不匹配错误:
错误
* Couldn't match type `a' with `b'
`a' is a rigid type variable bound by
the type signature for:
fmap :: forall a b. (a -> b) -> Tree a -> Tree b
at Monad.hs:8:9-12
`b' is a rigid type variable bound by
the type signature for:
fmap :: forall a b. (a -> b) -> Tree a -> Tree b
at Monad.hs:8:9-12
Expected type: Tree b
Actual type: Tree a
为什么我会收到此错误,但是当我也将 fmap
应用于子节点时,它编译没有问题:
fmap f (Node t left right) = Node (f t) (fmap f left) (fmap f right)
这是否意味着 Tree
中的所有 a
-s 必须以某种方式变成 b
-s ?在第一种情况下我只处理非函子?
^
Does it mean that all a
-s within the Tree
must somehow become b
-s ? and i am only dealing with the non-functor one in the first case ? ^
是的,没错。您正在尝试实现 fmap :: (a -> b) -> Tree a -> Tree b
,但是当您编写:
fmap f (Node t left right) = Node (f t) left right
您正在尝试使用参数 f t :: b
、left :: Tree a
和 right :: Tree a
调用 Node :: b -> Tree b -> Tree b -> Tree b
。将 Tree a
变成 Tree b
的唯一方法是通过 fmap f :: Tree a -> Tree b
,这就是为什么:
fmap f (Node t left right) = Node (f t) (fmap f left) (fmap f right)
按预期工作。
我正在尝试为以下类型实施 fmap
:
data Tree a = Leaf a | Node a (Tree a) (Tree a) | Empty deriving (Eq,Show)
instance Functor Tree where
fmap _ Empty=Empty
fmap f (Leaf x)=Leaf (f x)
fmap f (Node t left right)=Node (f t) left right
我不断收到类型不匹配错误:
错误
* Couldn't match type `a' with `b'
`a' is a rigid type variable bound by
the type signature for:
fmap :: forall a b. (a -> b) -> Tree a -> Tree b
at Monad.hs:8:9-12
`b' is a rigid type variable bound by
the type signature for:
fmap :: forall a b. (a -> b) -> Tree a -> Tree b
at Monad.hs:8:9-12
Expected type: Tree b
Actual type: Tree a
为什么我会收到此错误,但是当我也将 fmap
应用于子节点时,它编译没有问题:
fmap f (Node t left right) = Node (f t) (fmap f left) (fmap f right)
这是否意味着 Tree
中的所有 a
-s 必须以某种方式变成 b
-s ?在第一种情况下我只处理非函子?
^
Does it mean that all
a
-s within theTree
must somehow becomeb
-s ? and i am only dealing with the non-functor one in the first case ? ^
是的,没错。您正在尝试实现 fmap :: (a -> b) -> Tree a -> Tree b
,但是当您编写:
fmap f (Node t left right) = Node (f t) left right
您正在尝试使用参数 f t :: b
、left :: Tree a
和 right :: Tree a
调用 Node :: b -> Tree b -> Tree b -> Tree b
。将 Tree a
变成 Tree b
的唯一方法是通过 fmap f :: Tree a -> Tree b
,这就是为什么:
fmap f (Node t left right) = Node (f t) (fmap f left) (fmap f right)
按预期工作。