是否存在“非”约束运算符这样的事情?

时间:2014-12-11 13:19:19

标签: haskell constraints typeclass

假设我想编写一个函数来展平列表,列表列表,列表列表等等。我可以写下面的内容:

{-# 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约束会使两个实例重叠)

1 个答案:

答案 0 :(得分:7)

不,这是不可能的,因为Haskell的类型类总是打开的:编译器永远不会证明某些实例存在,因为有人可能仍然会在任何时候添加它后面。