我最近向
Scala提供了第二次机会,并从我始终实施的功能(功能或伪功能语言)开始:命题逻辑的自动推理器(以及后来的谓词逻辑).
现在,我已经尝试在语言本身中尽可能地获得命题逻辑的符号,而且我已经得到了一个隐含的转换(String – > Atom):
("A" and "B") implies "C"
函数“和”和“暗示”(和“或”和“等价”)是调用相关案例类构造函数的简单方法.但是,当执行“not”时,我被卡住了以下两个符号之一:
("A" and "B").not Not("A" and "B")
有没有办法来欺骗Scala接受所需的:
not("A" and "B")
最好不要将“不”改为“不”,因为我以后可能会称它为“¬”或其他东西.
解决方法
截至2014年2月,我认为在表达式上定义前缀不操作的最简单的方法是避免各种额外的cruft / wrap,将直接在包范围内声明函数以及所有其他函数,类,类型等:这是通过定义一个包对象来完成的(Scala不允许你把函数放在.scala文件的根级别上)(我想知道为什么只是跟随Java的脚步声? )).
package org.my.logiclib implicit class Atom(s: String) { ... } class MyType1 class MyType2 object `package` { def not(expr: Expr) = ... }
这样做,导入org.my.logiclib._将导入所有内容,包括not().
以上是一样的
package org.my package logiclib { implicit class Atom ... ... def not(expr: Expr) = ... }