假设您使用FlexibleInstances
扩展程序并拥有class
class C a where
f :: a b -> Maybe b
如何为数据类型列表列表实现它。特别是,如何写出类型。我唯一能找到的是如何为单个列表执行此操作,而不是列表或任何其他数据类型的列表。
这有效:
instance C [] where
...
但这不是
data D = ...
instance C [[D]] where
...
我怎么能表达这样的东西?
答案 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