我已经实现了一个自定义队列对象,我想用它来存储控制器中的先前项目.我想在我的控制器中将此类型用作私有变量,并且仅将其作为简单的CollectionType兼容对象公开给外部,以便客户端可以迭代或索引对象,而无需知道任何特定于类的详细信息,例如clear()函数.
Swift协议不能是通用的,所以不幸的是我不能简单地定义一个getter来返回一个CollectionOf<Type>.我已经使用以下抽象基类实现了这种行为,并从中继承了我的集合,但我希望可能有更多的Swift-y和内置方法来实现这一点,希望也不需要子类化:
class AnyCollectionOf<MemberT, IndexT: ForwardIndexType>: CollectionType {
// Sequence Type
func generate() -> GeneratorOf<MemberT> {
fatalError("must override")
}
// Collection Type
typealias Index = IndexT
typealias Element = MemberT
subscript (index: Index) -> Element {
get {
fatalError("must override")
}
}
var startIndex: Index {
get {
fatalError("must override")
}
}
var endIndex: Index {
get {
fatalError("must override")
}
}
}
Run Code Online (Sandbox Code Playgroud) 我一直在为WebAssembly指令定义GADT.许多这些指令构造函数具有相同的签名:
data Instruction result where
Add :: Instruction r -> Instruction r -> Instruction r
Sub :: Instruction r -> Instruction r -> Instruction r
Mul :: Instruction r -> Instruction r -> Instruction r
Run Code Online (Sandbox Code Playgroud)
使用正常值,您可以简单地为这些二元运算符声明类型别名:
type Binop r = Instruction r -> Instruction r -> Instruction r
Run Code Online (Sandbox Code Playgroud)
但是,当我在GADT定义中使用别名时:
{-# LANGUAGE GADTs #-}
module Data.Instruction where
type Binop r = Instruction r -> Instruction r -> Instruction r
data Instruction result where
Add :: Binop r
Sub :: Binop r …Run Code Online (Sandbox Code Playgroud)