在Swift中重新创建Functor类型

时间:2014-08-10 22:25:51

标签: swift

我想把Swift中的Functor类型作为协议,但是我遇到了类型子句的问题。

protocol Functor {
    typealias A
    func fmap<
        B, C
        where
        C == Self
        C.A == B>
        (A -> B) -> C
}

问题是C == Self sort意味着C与Self相同,因此具有相同的A.是否有任何方法可以定义类型相同但具有不同类型参数的泛型?< / p>

编辑:也许我应该澄清一下,这里的目标是在其他函数式语言中使用fmap,除了self是in参数,而不是fmap是一个带有in参数的全局函数。

1 个答案:

答案 0 :(得分:3)

不,不是今天。斯威夫特缺乏更高级的类型。它甚至不支持一阶类型。因此,作为第一步,您希望能够谈论您还不知道所包含对象类型的let x: Array<_>。斯威夫特无法处理。它也无法处理通用闭包。例如:

func firstT<T>(xs: [T]) -> T {
    return xs[0]
}
let ft = firstT // "Argument for generic parameter 'T' could not be inferred"

这些是简单的情况,并且Swift的类型系统已经开始崩溃(它可以将其作为函数定义处理,但不作为类型处理)。当被要求代表像Functor这样的高级类型时,Swift的类型系统完全崩溃。

对这个问题进行了更深入的讨论(但大多重申了我在这里所说的话:https://gist.github.com/rnapier/5a84f65886e1ee40f62e

请注意,这并非特别是“其他功能语言”的功能。首先,Swift并不是一种真正的功能语言;它只是具有一些功能,其次,并非所有功能语言都具有此功能(Haskell和Scala,是的,ML和LISP,否)。您需要的功能是更高级的类型,可以存在或不存在其他功能特性。

第4.3节更高级的Scala for generic programmers类型提供了一个很好的介绍。 Swift与Scala有一些非常有趣的相似之处,所以Scala的历史可以提供一些关于Swift可能有意义的提示(在Scala 2.5之前没有出现更高级的类型)。