我试图为自己的启发和兴趣编写一些与序列相关的函数。到目前为止,我有以下类型类:
class (Traversable s, Monad s) => Sequential s where
infixr 5 ~:
(~:) :: a -> s a -> s a
headEx :: s a -> a
tailEx :: s a -> s a
null :: s a -> Bool
class (Sequential s) => Finite s where
emptyS :: s a
其中第一个(Sequential
)用于表示所有顺序事物(包括有限序列和无限序列),而第二个用于仅有限序列事物。
我在定义一些基于这些的典型列表函数时遇到了一些与多态相关的问题。这些例子就是zip
,我最初的猜测是,它的类型签名为:
zip :: (Sequential s1, Sequential s2, Sequential s3) => s1 a -> s2 b -> s3 (a, b)
然而,我遇到了一个问题 - 如果我想将无限序列和有限序列压缩在一起,我显然希望结果也是有限序列。但是,我对实现的尝试失败了,因为Sequence
没有空虚概念(实际上不能有这样的概念,因为无限序列不能为空)。另外,我看不出任何方法来检查传入的Sequential
之一是否实际上是Finite
,这会导致Finite
结果。因此,我不确定如何以最一般的形式编写此实现。
我不确定我的方法是否有问题,或者我缺少哪种语言,但我真的想知道如何实现zip
泛型任意组合中的有限和无限序列。