我只是在尋找更好的Scala處事方法,所以問了一些新手問題。例如:如何減少布爾函數定義中的冗餘?
我希望能夠做的事情如下所示:
鑑於A,B,C分別是 「布爾」:
if (((a nand b) nand c) != (a nand (b nand c))) printf("NAND is not associative")
在那裏我會循環可能的一個, b,c布爾值。我這樣做的:
for (i <- 0 to 7) {
val (a,b,c) = (new MyBoolean((i & 4) >> 2 == 1),
new MyBoolean((i & 2) >> 1 == 1),
new MyBoolean((i & 1) == 1))
printf("%d (%s,%s,%s)\n",i,a,b,c)
if (((a nand b) nand c) != (a nand (b nand c))) printf("NAND\n")
}
我想我可以簡化多少有點:
val (a,b,c) = (new MyBoolean(i & 4 != 0),
new MyBoolean(i & 2 != 0),
new MyBoolean(i & 1 != 0))
凡我MyBoolean類的樣子:
class MyBoolean(val p: Boolean) {
def and(q: MyBoolean): MyBoolean = new MyBoolean(p && q.p)
override def toString: String = p.toString
override def equals (o : Any): Boolean = o match {
case m : MyBoolean => p == m.p
case _ => false
}
def and(q: Boolean): MyBoolean = new MyBoolean(p && q)
def or(q: Boolean): MyBoolean = new MyBoolean(p || q)
def or(q: MyBoolean): MyBoolean = or(q.p)
def negate: MyBoolean = new MyBoolean(!p)
def nand(q : Boolean): MyBoolean = new MyBoolean(!(p && q))
def nand(q : MyBoolean): MyBoolean = nand(q.p)
def nor(q : Boolean): MyBoolean = new MyBoolean(!(p || q))
def nor(q : MyBoolean): MyBoolean = nor(q.p)
def xor(q : Boolean): MyBoolean = new MyBoolean((p || q) && !(p && q))
def xor(q : MyBoolean): MyBoolean = xor(q.p)
def implies(q : Boolean): MyBoolean = new MyBoolean(!(p && !q))
def implies(q : MyBoolean): MyBoolean = implies(q.p)
def equiv(q : Boolean): MyBoolean = new MyBoolean(p == q)
def equiv(q : MyBoolean): MyBoolean = equiv(q.p)
}
這是合理的,或者是有一個更好的方式去做這件事? :)
我沒有像運氣嘗試新事物:
def nand(p : Boolean, q : Boolean): Boolean = !(p && q)
我不能去從那裏:
(a nand (b nand c))
我所希望的(一線希望)。 :)我真的不想介紹一種新的類型,只要有nand,nor等...可以使用布爾值就好了。
我認爲我的主要也呼籲減少冗餘,我在幾行使用不同的功能......但唯一改變的是函數名稱。
def main(args: Array[String]): Unit = {
for (i <- 0 to 7) {
val (a,b,c) = (new MyBoolean((i & 4) != 0),
new MyBoolean((i & 2) != 0),
new MyBoolean((i & 1) != 0))
printf("%d (%s,%s,%s)\n",i,a,b,c)
if (((a nand b) nand c) != (a nand (b nand c))) printf("NAND\n")
if (((a implies b) implies c) != (a implies (b implies c))) printf("IMPLIES\n")
if (((a nor b) nor c) != (a nor (b nor c))) printf("NOR\n")
if (((a xor b) xor c) != (a xor (b xor c))) printf("XOR\n")
if (((a equiv b) equiv c) != (a equiv (b equiv c))) printf("EQUIV\n")
}
}
-Jay
好主意,除非你已經通過使用圖案的元組每個操作匹配扔掉你的優勢。當你擁有的只有一個操作時,這就創建了一個額外的對象!此外,不匹配至少是一樣的:'def和(that:MyBoolean)= if((this eq TRUE)&&(that eq TRUE))TRUE else FALSE' – 2010-08-29 14:29:17
是的,這樣會更快。對於真實世界的實現,可能所有的方法都應該用這種方式編寫(需要隱式轉換否定等也不好)。 – Landei 2010-08-29 15:43:05