【发布时间】:2011-09-20 06:11:32
【问题描述】:
在进一步了解 Haskell 的类型系统时,我遇到了这个玩具问题。当我编译以下代码时:
data SingleData a = SingleData a Int String -- etc.
data DataFail a = DataFail [SingleData a]
instance Functor DataFail where
fmap f (DataFail xs) = DataFail (map f xs)
我在 fmap 的定义中收到可怕的“发生检查:无法构造无限类型:b = SingleData b”消息。奇怪的是,如果 fmap 在实例声明之外,相同的定义将起作用:
fmapWorks f (DataFail xs) = DataFail (map f xs)
更奇怪的是,实现 Monoid 编译并且工作得很好:
instance Monoid (DataFail a) where
mempty = DataFail []
mappend (DataFail xs) (DataFail ys) = DataFail (xs ++ ys)
我相信这在某种程度上是在 DataFail 中使用 SingleData 的结果,因为它也可以正常工作:
data DataSuccess a = DataSuccess [a]
instance Functor DataSuccess where
fmap f (DataSuccess xs) = DataSuccess (map f xs)
为什么 Haskell 抱怨 DataFail 的 fmap 函数,我可以做些什么来解决它?
【问题讨论】:
-
如果您查看
fmapWorks的类型,您会发现它不是fmap所需的类型。