非法数据类型上下文(使用DatatypeContexts):TypeFunctor f

时间:2018-01-29 22:15:19

标签: haskell

--{-# LANGUAGE DatatypeContexts #-}

class TypeFunctor f where
 mapf :: (a-> b)->(f a-> fb)

data TypeFunctor f => Fix f = In (f (Fix f))
out :: TypeFunctor f => Fix f -> f (Fix f)
out (In x) = x

fold :: TypeFunctor f => (f a -> a) -> (Fix f -> a)
fold f = f . mapf (fold f) . out

我收到以下错误消息:

  

错误:       非法数据类型上下文(使用DatatypeContexts):TypeFunctor f => | 4 | data TypeFunctor f =>修正f = In(f(Fix f))|
  ^^^^^^^^^^^^^

什么是问题?

编辑

newtype Fix f = In (f (Fix f))

out :: Functor f => Fix f -> f (Fix f)
out (In x) = x

fold :: Functor f => (f a -> a) -> (Fix f -> a)
fold f = f . fmap (fold f) . out

1 个答案:

答案 0 :(得分:2)

首先,您对扩展程序进行了评论。这没有任何作用:

-- {-# LANGUAGE DatatypeContexts #-}

这会启用DatatypeContexts扩展程序:

{-# LANGUAGE DatatypeContexts #-}

其次,正如警告所示,DatatypeContexts不应再使用了。相反,函数应该需要与它们相关的约束。