假设我想编写一个用于将列表,列表列表,列表列表列表等扁平化为仅列表的函数。我可以写以下内容:
{-# 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
约束会使两个实例重叠) 最佳答案
不,这是不可能的,因为Haskell的类型类始终是开放的:编译器永远无法证明某个实例不存在,因为有人可能会在以后的任何时间添加它。