【发布时间】:2016-06-19 03:19:12
【问题描述】:
所以我有以下代码:
module Queue where
class Queue t
where
enqueue :: t a -> a -> t a
dequeue :: t a -> Maybe (t a, a)
--和:
module DataQueue where
import Queue
data DQueue a = Empty | Enqueue a (DQueue a)
deriving (Eq, Show, Read)
instance Queue DQueue
where
enqueue (Empty) s = Enqueue s (Empty)
enqueue (Enqueue v ss) s = Enqueue s (Enqueue v ss)
dequeue Empty = Nothing
dequeue (Enqueue a (ss)) = Just(ss)
我将一个元素添加到列表(入队)中,效果很好。我还使用 dequeue 函数删除了列表中的一个元素。不知何故,我的 dequeue 函数的最后一行出现错误。它说:
“无法将预期类型
(DQueue a, a)与实际类型DQueue a匹配”
我真的不明白如何解决这个问题。
【问题讨论】:
-
通常,我们认为出队是从前面开始的,用像
dequeue :: t a -> Maybe (a, t a)这样的类型签名来表示。不相关:多参数类型类和函数依赖提供了更好的表达方式。class Queue el q | q -> el where { enqueue :: q -> el -> q; dequeue :: q -> Maybe (el, q) }。这允许单态(例如,未装箱)队列实例化类。