【问题标题】:Can scala syntatic sugar make a congruence mod n?scala语法糖可以使同余mod n吗?
【发布时间】:2018-01-17 04:52:13
【问题描述】:

考虑 2+7 == 3+6 (mod 5)。你能知道如何使用 scala 语法糖在 scala 代码中实现相同的功能吗?

请记住,2+7 和 3+6 是常规的 scala Int,因此将 + 或 == 覆盖为 mod 5 不起作用。我实际上对代数 A 上更复杂的同余感兴趣。我可以做A.congruent(a,b),并用一些不错的符号(如A.~(a,b))来写,但我对a == b (A)a ==(A) bA(a == b) 感兴趣。在 a 和 b 之间出现一致的东西。

我的斗争的底线是,同余是为类型A 定义的,a,b 是传递给A 但实际上不是A 类型的一些元素。例如。 A 可能是一组矩阵,如果单个矩阵 ab 相差一个标量,即a*b^-1=sI_n,则一致。特别是,ab 将存在于许多组中,并且一致性将基于此而改变。所以我不可能简单地将ab 中的引用添加回A

正确的解决方案似乎是数学解决方案,用A而不是变量ab标记等价。然而 scala 语法糖可能没有这样的甜蜜。任何建议表示赞赏。

【问题讨论】:

  • 为了澄清上下文,我很高兴有一个只是欺骗 REPL 的解决方案。如果用户正在编写自己的实际代码,那么像 A.cong(a,b) 这样的前缀符号不会抛出它们。但是不怎么写代码的学生和老师更喜欢书本中的中缀风格。

标签: scala syntax equivalence


【解决方案1】:

试试这个:

implicit class ModEquals(a: Int) {
    def %%(n: Int) = new { def ===(b: Int) = (a - b) % n == 0 }
}

用法:

7 %% 3 === 10

此解决方案通过采用一致性的%% 方法丰富了Ints。在这个例子中,它只是模数,但这可以很容易地扩展到任何东西。返回的对象是一个定义了 === 方法以实现相等检查的类。

【讨论】:

  • 聪明,隐式类的想法是我需要的提示,虽然我打算用def ~(b:Int) = (a-b)%n == 0替换def %%等似乎更容易,所以可以简单地写n=5; (2+7)~(4+10)(真)并更改 n,n=7; (2+7)~(4+10) false。正如@thesamet 指出的那样,它很容易适应通用的一致性。谢谢!
【解决方案2】:
import scala.languageFeature.implicitConversions
import scala.languageFeature.reflectiveCalls

case class ModuloArg(list: List[Int]) {
  assert(list.size > 1)

  def ==%%?(m: Int) = {
    val hm = list.head % m
    list.tail.filter(i => (i % m) != hm).isEmpty
  }

  def ::%%(n: Int) = ModuloArg(n :: list)

}

implicit class ModuloArgOps(i: Int) {
  def ::%%(n: Int) = ModuloArg(n :: i :: Nil)
}

现在,您可以使用这些来检查模相等,

// 4 == 10 (mod 3) 
scala> val mod3Equal4And10 = 4 ::%% 10 ==%%? 3
// mod3Equal4And10: Boolean = true

// 4 == 11 (mod 3) 
scala> val mod3Equal4And11 = 4 ::%% 11 ==%%? 3
//mod3Equal4And11: Boolean = false

// 4 == 10 == 13 == 16 (mod 3)
scala> val mod3Equal4And10And13And16 = 4 ::%% 10 ::%% 13 ::%% 16 ==%%? 3
// mod3Equal4And10And13And16: Boolean = true

【讨论】:

    猜你喜欢
    • 2013-07-05
    • 1970-01-01
    • 1970-01-01
    • 2011-03-08
    • 2013-11-28
    • 2014-08-10
    • 2019-06-09
    • 2022-06-29
    • 2014-09-04
    相关资源
    最近更新 更多