假设我想编写一个函数来展平列表,列表列表,列表列表等等。我可以写下面的内容:
{-# LANGUAGE TypeFamilies #-}
class Flattenable a where
type Flattened a
flatten :: a -> Flattened a
instance NotFlattenable a => Flattenable [a] where
type Flattened [a] = [a]
flatten = id
instance Flattenable a => Flattenable [a] where
type Flattened [a] = Flattened a
flatten = concat . map flatten
其中NotFlattenable a
是一些约束,限制那些a
没有Flattenable
的实例。 NotFlattenable
是合法约束吗?我该怎么写呢? (请注意,缺少NotFlattenable
约束会使两个实例重叠)
答案 0 :(得分:7)
不,这是不可能的,因为Haskell的类型类总是打开的:编译器永远不会证明某些实例不存在,因为有人可能仍然会在任何时候添加它后面。