我希望有以下几点:
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
}如果函数可以有这种类型的参数,为什么结构不能有这种类型的成员变量呢?
发布于 2021-07-29 03:22:33
这可以通过使结构和/或成员变量函数具有fileprivate或private访问控制来实现:
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
}https://stackoverflow.com/questions/68564803
复制相似问题