swift - 在 Swift 中重新创建 Functor 类型

标签 swift

我想在 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/

相关文章:

swift - 数字范围的正则表达式

Swift 关闭错误

Xcode 导航栏位于 ScrollView 下方?

ios - 自动滚动时单元格文本复制到另一行(通过拖放)

swift - “ fatal error :在展开可选值时意外发现nil”是什么意思?

ios - Xcode 7.3 : import Module displayed with strikethrough

iOS - 不同 Storyboard中的容器组件

swift - 查找 sigabrt 消息

swift - 在枚举中传递数组

ios - 在 Segue - Swift 中使用 "OR"构造函数