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

Jos*_*lin 4 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
Run Code Online (Sandbox Code Playgroud)

其中NotFlattenable a一些约束来限制那些a没有的一个实例Flattenable.是NotFlattenable合法的约束吗?我该怎么写呢?(注意,没有NotFlattenable约束会使两个实例重叠)

lef*_*out 7

不,这是不可能的,因为Haskell的类型类是常开:编译器不能证明某些情况下也不会存在,因为有人可能仍然添加它以后的任何时间.

  • 如果你对一个封闭的类"Flattenable"感到满意,你可以使用封闭类型的家庭来解决问题. (2认同)