小编gnt*_*skn的帖子

你可以在Swift中指定一个返回类型作为特定类型的任何集合吗?

我已经实现了一个自定义队列对象,我想用它来存储控制器中的先前项目.我想在我的控制器中将此类型用作私有变量,并且仅将其作为简单的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)

generics protocols swift

6
推荐指数
1
解决办法
1212
查看次数

是否可以在GADT定义中使用类型别名?

我一直在为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)

haskell ghc

5
推荐指数
1
解决办法
120
查看次数

标签 统计

generics ×1

ghc ×1

haskell ×1

protocols ×1

swift ×1