Why would that be a problem? The caller has to provide a function for "adding" and "multiplying" an N, and as long as I define what it means to multiply and add strings it shouldn't matter that I'm using a dual number where both components are strings.
But I think this is a case of the rectangle-square problem: dual scalars and a dual vectors a both a subset of dual quaternions that contain less information than their supertype. I guess what I'm really looking for is a way to "magically" promote objects. A quaternion is an object of H = {a + bi + cj + dk | a,b,c,d ∈ R}, a vector is an object of V = {ai + bj + ck | a,b,c ∈ R}, but we can also view H as H = R × V = {(a, v) | a ∈ R, v ∈ V}. The first definition of H is how it is usually defined and written out, but the second definition makes it easier to compute the product: (p_r, p_v) (q_r, q_v) = (p_r q_r - p_v ⋅ q_v, p_r q_v + q_r p_v + p_v × q_v). So far this is a simple hierarchy. But the set of scalars and the set of vectors can be embedded in the set of quaternions: R → H, a ↦ (a, 0) and V → H, v ↦ (0, v) We can also define things like the "quaternion cross product" and "quaternion dot product" for quaternions where the scalar part is zero: (0, p) × (0, q) := (p, p × q) (0, p) ⋅ (0, q) := (p ⋅ q, 0) I'm starting to think this is becoming a pointless exercise. Maybe I should just limit myself to "dual quaternions are a pair of quaternions" and "quaternions are pairs of a scalar and a vector" and forget about the magic subtyping. On Tuesday, February 6, 2018 at 12:01:42 AM UTC+1, Sam Tobin-Hochstadt wrote: > > I'm not sure how the "If" got there. > > But to say more, consider your function: > > (: dual-* (∀ (N) (→ (Dual-Number N) (Dual-Number N) (→ N N N) (→ N N > N) (Dual-Number N)))) > (define (dual-* d1 d2 * +) > (cond > [(D? d1) > (D > (D-real d1) > (D-dual d1))] > [else (D d1 d1)])) > > Now you imagine instantiating `N` with things like `(Vector3 Real)`, > but if we instantiated it instead with `(Dual-Number String)`, then > you'd have a problem. > > Sam > -- You received this message because you are subscribed to the Google Groups "Racket Users" group. To unsubscribe from this group and stop receiving emails from it, send an email to racket-users+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.