Skip to content

Instantly share code, notes, and snippets.

@zraffer
Created December 10, 2017 18:52
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save zraffer/c426203df828276992e3cc01fc471932 to your computer and use it in GitHub Desktop.
Save zraffer/c426203df828276992e3cc01fc471932 to your computer and use it in GitHub Desktop.
scala-bimodule
object Main {
abstract class Ab[A] {
val add: (A, A) => A
val neg: A => A
}
abstract class Ring[R] extends Ab[R] {
val mul: (R, R) => R
}
abstract class Field[F] extends Ring[F] {
val inv: F => Option[F]
}
abstract class Mod[A: Ring, M, B: Ring] extends Ab[M]
{
val lact: (A, M) => M
val ract: (M, B) => M
}
type +[M, N] = (M, N)
implicit def Mod1_+[A: Ring, M, N, B: Ring](implicit Mod_M: Mod[A, M, B], Mod_N: Mod[A, N, B] ): Mod[A, M+N, B] =
new Mod[A, M+N, B] {
override val lact: (A, (M, N)) => (M, N) = ???
override val ract: ((M, N), B) => (M, N) = ???
override val add: ((M, N), (M, N)) => (M, N) = ???
override val neg: M + N => M + N = ???
}
implicit def Mod2_+[A: Ring, M: Mod[A, ?, B], N: Mod[A, ?, B], B: Ring]: Mod[A, M+N, B] =
new Mod[A, M+N, B] {
override val lact: (A, (M, N)) => (M, N) = ???
override val ract: ((M, N), B) => (M, N) = ???
override val add: ((M, N), (M, N)) => (M, N) = ???
override val neg: M + N => M + N = ???
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment