Haskell 有没有a';不是';约束算子?

Haskell 有没有a';不是';约束算子?,haskell,constraints,typeclass,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

假设我想写一个函数,用于将列表、列表列表列表、列表列表列表等展平到列表。我可以这样写:

{-# 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

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

不,这是不可能的,因为Haskell的类型类始终是打开的:编译器永远无法证明某个实例不存在的,因为以后可能还会有人添加它。

很抱歉,简短的回答,这仍然需要提及封闭类型族和
OverlappingInstances
欺骗。
OverlappingInstances
令人讨厌。如果您对封闭类
Flattable
感到满意,您可以使用封闭类型族来破解某些东西。@augustss,是否可以详细说明一下?