类的更高的kinded Types和Type参数

时间:2017-03-18 13:44:58

标签: class haskell higher-kinded-types

假设您使用FlexibleInstances扩展程序并拥有class

class C a where
    f :: a b -> Maybe b

如何为数据类型列表列表实现它。特别是,如何写出类型。我唯一能找到的是如何为单个列表执行此操作,而不是列表或任何其他数据类型的列表。

这有效:

instance C [] where
    ...

但这不是

data D = ...

instance C [[D]] where
    ...

我怎么能表达这样的东西?

1 个答案:

答案 0 :(得分:3)

您需要newtype

class C a where
    f :: a b -> b  -- the class before the OP edited

newtype LL a = LL [[a]]
instance C LL where
   f (LL xss) = ...

但是,编写一个完全有意义的实例是不可能的,因为如果list-of-lists为空,则无法提取元素。我们能做的最好的事情是

instance C LL where
   f (LL xss) = case concat xss of
      (x:_) -> x
      _     -> error "f: no elements"

我不确定这是不是一个好主意。

作为替代方案,您可以使用类型系列或功能依赖项。这是一个类型系列的解决方案。

{-# LANGUAGE TypeFamilies, FlexibleInstances #-}

class C a where
   type T a
   f :: a -> Maybe (T a)

instance C [[b]] where
   type T [[b]] = b
   f xss = case concat xss of
      []    -> Nothing
      (x:_) -> Just x