在了解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)
Run Code Online (Sandbox Code Playgroud)
我得到了可怕的"发生检查:无法构造无限类型:b = SingleData b"消息对fmap的定义.奇怪的是,如果fmap在实例声明之外,它的相同定义将起作用:
fmapWorks f (DataFail xs) = DataFail (map f xs)
Run Code Online (Sandbox Code Playgroud)
更奇怪的是,实现Monoid编译并且工作得很好:
instance Monoid (DataFail a) where
mempty = DataFail []
mappend (DataFail xs) (DataFail ys) = DataFail (xs ++ ys)
Run Code Online (Sandbox Code Playgroud)
我相信这在某种程度上是在DataFail中使用SingleData的结果,因为这也可以正常工作:
data DataSuccess a = DataSuccess [a]
instance Functor DataSuccess where
fmap f (DataSuccess xs) = …Run Code Online (Sandbox Code Playgroud)