По умолчанию Haskell не может генерировать экземпляры Foldable
и Functor
. В Глава 11. Спецификация производных экземпляров отчета Haskell 2010 указывается, что он может автоматически получить экземпляр класса типов C заданный :
- C является одним из
Eq
, Ord
, Enum
, Bounded
, Show
или Read
.
(…)
Вы можете использовать DeriveFoldable
и DeriveFunctor
языковые расширения Glasgow Haskell Compiler (GH C) , чтобы включить это:
{-# LANGUAGE <b>DeriveFoldable, DeriveFunctor</b> #-}
data Stream a = a :> Stream a
deriving (Functor, Foldable)
fromlist :: [a] -> Stream a
fromlist xs = go (cycle xs)
where go (a: rest) = a :> go rest
countStream :: Stream Int
countStream = fromList [0..]
или вы можете указать экземпляр самостоятельно, например:
{-# LANGUAGE DeriveFoldable #-}
data Stream a = a :> Stream a
deriving (Foldable)
instance Functor Stream where
<b>fmap</b> f (x:>xs) = f x :> fmap f xs
Существуют и другие расширения, например, чтобы сделать его экземпляром Traversable
, Generic
, Lift
, et c.