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约束会使两个实例重叠)
不,这是不可能的,因为Haskell的类型类是常开:编译器不能证明某些情况下也不会存在,因为有人可能仍然添加它以后的任何时间.