小编Mik*_*cki的帖子

使用数据内部数据时的Functor错误:"无法构造无限类型"

在了解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)

haskell types

1
推荐指数
1
解决办法
120
查看次数

标签 统计

haskell ×1

types ×1