如何在swift中使用泛型定义类型别名

时间:2015-04-07 00:54:37

标签: swift generics type-alias

我正在使用swift中的谓词变换器函数:

infix operator ⋀ {}
infix operator ∨ {}
prefix operator ¬ {}
infix operator ⟹ {}


func ⋀ <T>(A : T->Bool , B: T->Bool)->T->Bool{
    return { x in A(x) && B(x)}
}

func ∨ <T>(A : T->Bool , B: T->Bool)->T->Bool{
    return { x in A(x) || B(x)}
}

prefix func ¬ <T>(A : T->Bool)->T->Bool{
    return { x in !A(x)}
}


func ⟹ <T>(A : T->Bool , B: T->Bool)->T->Bool{
    return { x in (¬A ∨ B)(x)}
}

func TRUE<T>()->T->Bool{
    return{x in true}
}

func FALSE<T>()->T->Bool{
    return{x in false}
}

infix operator ∘ {}
func ∘ <X,Y,Z>(f:X->Y, g:Y->Z)->X->Z{
    return{ x in g(f(x))}
}

func PTRANS<X,Y> (f:X->Y)->(Y->Bool)->(X->Bool){
    return {q in (f ∘ q) }
}

我尝试为谓词类型定义一个类型:PRED<T> = X->Bool其中X在泛型类型中,以便我的代码可以重写,例如喜欢 :

 func PTRANS<X,Y> (f:X->Y)->PRED<Y>->PRED<X>{
        return {q in (f ∘ q) }
    }

我试过了:

typealias PRED = <T>(T->Bool)

但是我收到以下错误消息:

  

只有句法类型可以是通用的

尝试:typealias PRED<T> = (T->Bool)在语法上似乎不正确导致:

  

expected = in typealiase declaration

如何为typealias上的谓词声明与Array<T>类似的Ttypealias PRED<T> = T->Bool

任何想法?

1 个答案:

答案 0 :(得分:2)

至少目前,typealias不支持通用类型别名,例如C ++ using关键字。

但你可以通过以下方式完成。

struct Pred<A> {
    typealias t = A -> Bool
}
let gt2: Pred<Int>.t = { n in n > 2 }