Description
I wonder if we might rather define our trig functions in terms of an Angle
type:
public struct Angle<T: Real> {
public var radians: T
public init(radians: T) { self.radians = radians }
public static func radians(_ val: T) -> Angle<T> { .init(radians: val) }
public var degrees: T { radians * 180 / .pi }
public init(degrees: T) { self.init(radians: degrees * .pi / 180) }
public static func degrees(_ val: T) -> Angle<T> { .init(degrees: val) }
}
Browsing SE-0246, this alternative design doesn't seem to have been considered, but I think it would help to make our functions more useful and self-documenting. Depending on what you're doing, it can be more natural to think in terms of degrees rather than radians. In C, people tend to bring these utility functions/macros by themselves, whereas other languages like Java include them as part of the standard library.
The design of the type given above means that creating and consuming an Angle
in radians in essentially free.
Clearly, we cannot make this change to the ElementaryFunctions
protocol requirements, as we need the conforming type to provide those implementations. However, we can do this for the free functions - either in addition to, or in place of the regular functions which take a <T:ElementaryFunctions>
argument.