<div><div class="gmail_msg">There _may_ be value in recognizing the distinction between rings and fields, perhaps? Just as the FP protocols make room for people to implement their own decimal FP types, and just as you&#39;re trying to make Arithmetic accommodate complex numbers, the distinction would allow someone to write algorithms generic over rationals and reals (i.e. fields). Being able to represent exact fractions isn&#39;t so terribly niche, and I think the design wouldn&#39;t be terribly complicated by its accommodation:</div><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">```</div><div class="gmail_msg">// rename Arithmetic to Ring</div><div class="gmail_msg">// it&#39;s acceptable to omit `.one` from Ring, though some may call that a Pseudoring</div><div class="gmail_msg">// consider omitting division from Ring and pushing it down to BinaryInteger and Field</div><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">protocol BinaryInteger : Ring { ... }</div><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">protocol Field : Ring {</div><div class="gmail_msg">  static var one { get }</div></div><div><div class="gmail_msg">  static func / (Self, Self) -&gt; Self</div><div class="gmail_msg">  static func /= (inout Self, Self)</div></div><div><div class="gmail_msg">  var inverted: Self { get } // default impl: .one / self</div><div class="gmail_msg">}</div><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">protocol FloatingPoint : Field { ... }</div><div class="gmail_msg">// rational number types and complex number types</div><div class="gmail_msg">// would also conform to Field</div><div class="gmail_msg">```</div></div><div><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg"><br class="gmail_msg"><div class="gmail_quote gmail_msg"><div class="gmail_msg">On Sun, Jan 15, 2017 at 09:14 Dave Abrahams via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" class="gmail_msg" target="_blank">swift-evolution@swift.org</a>&gt; wrote:<br class="gmail_msg"></div><blockquote class="gmail_quote gmail_msg" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><br class="gmail_msg"><br class="gmail_msg">on Sun Jan 15 2017, Anton Zhilin &lt;<a href="mailto:swift-evolution@swift.org" class="gmail_msg" target="_blank">swift-evolution@swift.org</a>&gt; wrote:<br class="gmail_msg"><br class="gmail_msg"><br class="gmail_msg"><br class="gmail_msg">&gt; What about taking a mathematical approach to numbers?<br class="gmail_msg"><br class="gmail_msg">&gt;<br class="gmail_msg"><br class="gmail_msg">&gt; protocol Group : Equatable {<br class="gmail_msg"><br class="gmail_msg">&gt;     static var zero: Self { get }<br class="gmail_msg"><br class="gmail_msg">&gt;     static func + (Self, Self) -&gt; Self<br class="gmail_msg"><br class="gmail_msg">&gt;     static func += (inout Self, Self)<br class="gmail_msg"><br class="gmail_msg">&gt;     static func - (Self, Self) -&gt; Self<br class="gmail_msg"><br class="gmail_msg">&gt;     static func -= (inout Self, Self)<br class="gmail_msg"><br class="gmail_msg">&gt;     static prefix func - (Self) -&gt; Self<br class="gmail_msg"><br class="gmail_msg">&gt; }<br class="gmail_msg"><br class="gmail_msg">&gt;<br class="gmail_msg"><br class="gmail_msg">&gt; protocol Ring : Group {<br class="gmail_msg"><br class="gmail_msg">&gt;     static var one: Self { get }<br class="gmail_msg"><br class="gmail_msg">&gt;     static func * (Self, Self) -&gt; Self<br class="gmail_msg"><br class="gmail_msg">&gt;     static func *= (inout Self, Self)<br class="gmail_msg"><br class="gmail_msg">&gt;     func tryDivide(by: Self) -&gt; Self?<br class="gmail_msg"><br class="gmail_msg">&gt;     func tryInvert() -&gt; Self?<br class="gmail_msg"><br class="gmail_msg">&gt; }<br class="gmail_msg"><br class="gmail_msg">&gt;<br class="gmail_msg"><br class="gmail_msg">&gt; protocol Field : Ring {<br class="gmail_msg"><br class="gmail_msg">&gt;     static func / (Self, Self) -&gt; Self<br class="gmail_msg"><br class="gmail_msg">&gt;     static func /= (inout Self, Self)<br class="gmail_msg"><br class="gmail_msg">&gt;     var inverted: Self { get }<br class="gmail_msg"><br class="gmail_msg">&gt; }<br class="gmail_msg"><br class="gmail_msg">&gt;<br class="gmail_msg"><br class="gmail_msg">&gt; protocol VectorSpace : Group {<br class="gmail_msg"><br class="gmail_msg">&gt;     associatedtype Scalar : Field<br class="gmail_msg"><br class="gmail_msg">&gt;     static func * (Self, Scalar) -&gt; Self<br class="gmail_msg"><br class="gmail_msg">&gt;     static func *= (inout Self, Scalar) -&gt; Self<br class="gmail_msg"><br class="gmail_msg">&gt;     static func / (Self, Scalar) -&gt; Self<br class="gmail_msg"><br class="gmail_msg">&gt;     static func /= (inout Self, Scalar) -&gt; Self<br class="gmail_msg"><br class="gmail_msg">&gt;     static func * (Scalar, Self) -&gt; Self<br class="gmail_msg"><br class="gmail_msg">&gt; }<br class="gmail_msg"><br class="gmail_msg"><br class="gmail_msg"><br class="gmail_msg">The first test for the inclusion of any protocol in the standard library<br class="gmail_msg"><br class="gmail_msg">is: “what generic algorithm that uses this protocol as a constraint<br class="gmail_msg"><br class="gmail_msg">would be appropriate for inclusion in the standard library?”<br class="gmail_msg"><br class="gmail_msg"><br class="gmail_msg"><br class="gmail_msg">I don&#39;t think we have a use for any of the above directly in the<br class="gmail_msg"><br class="gmail_msg">standard library.  All the generic algorithms I know of that would be<br class="gmail_msg"><br class="gmail_msg">appropriate to those protocols are part of some specialized domain that<br class="gmail_msg"><br class="gmail_msg">should have its own library built on top of the Swift standard lib.<br class="gmail_msg"><br class="gmail_msg"><br class="gmail_msg"><br class="gmail_msg">&gt; Detalization of mathematical terminology will be determined by what kind of<br class="gmail_msg"><br class="gmail_msg">&gt; types we have in the standard library. Integer types are rings (except for<br class="gmail_msg"><br class="gmail_msg">&gt; overflow), floating-point types are fields (except for precision), point<br class="gmail_msg"><br class="gmail_msg">&gt; types are linear spaces, so I thought the abstractions above are the bare<br class="gmail_msg"><br class="gmail_msg">&gt; minimum.<br class="gmail_msg"><br class="gmail_msg">&gt;<br class="gmail_msg"><br class="gmail_msg">&gt; Unfortunately, Swift doesn’t have rename operations for protocol<br class="gmail_msg"><br class="gmail_msg">&gt; requirements, so we can’t express groups that use operations other than +<br class="gmail_msg"><br class="gmail_msg">&gt; and -. What we can do is to include an adapter to wrap current instance in<br class="gmail_msg"><br class="gmail_msg">&gt; an additive group interface:<br class="gmail_msg"><br class="gmail_msg">&gt;<br class="gmail_msg"><br class="gmail_msg">&gt; struct MultiplicativeGroupAdapter&lt;T: Field&gt; : Group {<br class="gmail_msg"><br class="gmail_msg">&gt;     // ...<br class="gmail_msg"><br class="gmail_msg">&gt; }<br class="gmail_msg"><br class="gmail_msg">&gt;<br class="gmail_msg"><br class="gmail_msg">&gt; extension Field {<br class="gmail_msg"><br class="gmail_msg">&gt;     var multiplicativeGroup: MultiplicativeGroupAdapter&lt;Self&gt;<br class="gmail_msg"><br class="gmail_msg">&gt; }<br class="gmail_msg"><br class="gmail_msg">&gt;<br class="gmail_msg"><br class="gmail_msg">&gt; ​<br class="gmail_msg"><br class="gmail_msg">&gt; _______________________________________________<br class="gmail_msg"><br class="gmail_msg">&gt; swift-evolution mailing list<br class="gmail_msg"><br class="gmail_msg">&gt; <a href="mailto:swift-evolution@swift.org" class="gmail_msg" target="_blank">swift-evolution@swift.org</a><br class="gmail_msg"><br class="gmail_msg">&gt; <a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" class="gmail_msg" target="_blank">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br class="gmail_msg"><br class="gmail_msg">&gt;<br class="gmail_msg"><br class="gmail_msg"><br class="gmail_msg"><br class="gmail_msg">--<br class="gmail_msg"><br class="gmail_msg">-Dave<br class="gmail_msg"><br class="gmail_msg"><br class="gmail_msg"><br class="gmail_msg">_______________________________________________<br class="gmail_msg"><br class="gmail_msg">swift-evolution mailing list<br class="gmail_msg"><br class="gmail_msg"><a href="mailto:swift-evolution@swift.org" class="gmail_msg" target="_blank">swift-evolution@swift.org</a><br class="gmail_msg"><br class="gmail_msg"><a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" class="gmail_msg" target="_blank">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br class="gmail_msg"><br class="gmail_msg"></blockquote></div></div></div>