首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Swift AutoDiff:我们如何让一个结构拥有一个成员变量,它是一个由多个参数组成的可微函数?

Swift AutoDiff:我们如何让一个结构拥有一个成员变量,它是一个由多个参数组成的可微函数?
EN

Stack Overflow用户
提问于 2021-07-29 01:19:31
回答 1查看 44关注 0票数 1

我希望有以下几点:

代码语言:javascript
复制
import _Differentiation

struct S {
    var f: @differentiable(reverse) (Double, Double) -> Double
}

但是编译器会抱怨Error: Abort trap: 6,堆栈跟踪的开始是

代码语言:javascript
复制
Assertion failed: (isa<X>(Val) && "cast<Ty>() argument of incompatible type!"), function cast, file Casting.h, line 269.

如果成员变量是一个参数的函数,则程序构建:

代码语言:javascript
复制
import _Differentiation

struct S {
    var f: @differentiable(reverse) (Double) -> Double
}

但不允许有两个或多个参数。

我们可以编写一个具有两个参数的可微函数作为参数的函数:

代码语言:javascript
复制
import _Differentiation

func g(f: @differentiable(reverse) (Double, Double) -> Double) {
    // function body
}

如果函数可以有这种类型的参数,为什么结构不能有这种类型的成员变量呢?

EN

回答 1

Stack Overflow用户

发布于 2021-07-29 03:22:33

这可以通过使结构和/或成员变量函数具有fileprivateprivate访问控制来实现:

代码语言:javascript
复制
import _Differentiation

struct S {
    fileprivate var f: @differentiable(reverse) (Double, Double, Double) -> Double
}

代码语言:javascript
复制
import _Differentiation

fileprivate struct S {
    public var f: @differentiable(reverse) (Double, Double, Double) -> Double
}

请注意,在第二个示例中,f可以为public,因为S至少被限制为fileprivate

一种解决方法是使f成为另一个可区分数据结构的函数,例如:

代码语言:javascript
复制
import _Differentiation

struct S {
    struct Tuple: Differentiable {
        var x: Double
        var y: Double
        @differentiable(reverse)
        init(x: Double, y: Double) {
            self.x = x
            self.y = y
        }
    }
    var f: @differentiable(reverse) (Tuple) -> Double
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68564803

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档