1

我想要以下内容:

import _Differentiation

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

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

Assertion failed: (isa<X>(Val) && "cast<Ty>() argument of incompatible type!"), function cast, file Casting.h, line 269.

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

import _Differentiation

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

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

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

import _Differentiation

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

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

4

1 回答 1

0

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

import _Differentiation

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

或者

import _Differentiation

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

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

一种变通方法是制作f另一个可微分数据结构的函数,例如:

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
}

于 2021-07-28T19:22:32.820 回答