假设我想编写一个用于将列表,列表列表,列表列表列表等扁平化为仅列表的函数。我可以写以下内容:

{-# 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实例的那些FlattenableNotFlattenable是合法约束吗?我该如何写呢? (请注意,缺少NotFlattenable约束会使两个实例重叠)

最佳答案

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

09-25 19:50