我想在 Swift 中将 Functor 类型作为协议(protocol),但我在使用类型子句时遇到了问题。
protocol Functor {
typealias A
func fmap<
B, C
where
C == Self
C.A == B>
(A -> B) -> C
}
问题是 C == Self 有点暗示 C 与 Self 相同,因此具有相同的 A。有什么方法可以定义类型相同但类型参数不同的泛型?
编辑:也许我应该澄清一下,这里的目标是像其他函数式语言中的 fmap 一样运行,除了 self 是 in 参数,而不是 fmap 是一个接受 in 参数的全局函数。
最佳答案
不,不是今天。 Swift 缺少更高种类的类型。它甚至不支持一阶类型。因此,作为第一步,您希望能够谈论 let x: Array<_>
您还不知道所包含对象的类型的地方。 swift 无法处理。它也不能处理通用闭包。例如:
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 才出现)。
关于swift - 在 Swift 中重新创建 Functor 类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25233594/