我定义了一个自定义相等运算符(定义并不重要,所以我将插入虚拟东西):
let ( ~=~ ) a b = true
Run Code Online (Sandbox Code Playgroud)
如果我尝试使用它中缀:
if a ~=~ b then 1 else 2
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:This expression is not a function; it cannot be applied.
我可以通过将操作符重命名~=~为=~或通过将其作为函数调用来解决此问题:if (~=~) a b then 1 else 2.
这似乎是运营商的一个普遍问题~.我的问题是为什么我不能使用这样的运算符中缀?~符号有什么特别之处吗?
注意:我已经通过了文档,但我找不到任何相关的内容.也许我错过了什么?
我的问题:符号表达操作.
在+, - ,*,/,min,max之类的运算符的帮助下,从整数常量和变量开始构建符号表达式.更准确地说,我将用以下方式表示一个表达式(Caml代码):
type sym_expr_t =
| PlusInf
| MinusInf
| Const of int
| Var of var_t
| Add of sym_expr_t * sym_expr_t
| Sub of sym_expr_t * sym_expr_t
| Mul of sym_expr_t * sym_expr_t
| Div of sym_expr_t * sym_expr_t
| Min of sym_expr_t * sym_expr_t
| Max of sym_expr_t * sym_expr_t
Run Code Online (Sandbox Code Playgroud)
我想,为了执行有用和有效的计算(例如a + b - a = 0或a + 1> a),我需要有某种正常形式并对其进行操作.上述表示可能不会太好.
有人能指出我应该如何处理这个问题吗?我不需要代码.如果我知道如何,这可以很容易地写出来.与提供正常形式表示和/或构建/简化/比较算法的论文的链接也会有所帮助.
另外,如果您知道Ocaml库,请告诉我.
我需要在我的一个函数中检测到一个可交换模式.我认为编写以下内容将完成工作:
let my_fun a b = match a,b with
(*...*)
| a,b
| b,a when is_valid b -> process b (***)
(*...*)
Run Code Online (Sandbox Code Playgroud)
这不起作用,Ocaml抱怨这个子模式是
标记为的行的未使用警告(***).
1)有人可以向我解释这个警告试图说什么以及为什么这不起作用?
2)如果不if then else考虑我现在想要哪个参数的事实,我怎样才能真正优雅地写出这个is_valid?
2)是否可以仅使用模式匹配来获得预期的功能而不重复,when is_valid b -> process b因为它发生在下面?
let my_fun a b = match a,b with
(*...*)
| a,b when is_valid b -> process b
| b,a when is_valid b -> process b
(*...*)
Run Code Online (Sandbox Code Playgroud)
编辑:
在我的具体例子中a,b是成对的.该功能有点复杂,但以下将说明这种情况:
let f a …Run Code Online (Sandbox Code Playgroud) 假设我有以下记录:
type t = {a:int}
Run Code Online (Sandbox Code Playgroud)
为了a从列表中选择字段的值,我执行以下操作:
let x = [{a=1};{a=2}]
let y = List.map (fun t -> t.a) x
Run Code Online (Sandbox Code Playgroud)
这对我来说有点"不干净".作为比较,在Haskell中我会做以下事情:
data T = T { a :: Int}
x = [T {a = 1}, T {a = 2}]
y = map a x
Run Code Online (Sandbox Code Playgroud)
有没有办法在Ocaml中编写类似的东西(可能使用外部库)?如果不可能,有人可以解释为什么这个限制?
无论如何在emacs中使用tuareg-mode时指定annot文件的路径?我试图找出我的函数的类型,模式抱怨"不是注释文件".
我的构建结构是:
lib
obj
*.o
*.cmi
*.cmx
*.annot
src
*.ml
*.mli
Run Code Online (Sandbox Code Playgroud) 有一种简单的方法可以从Ocaml数据类型转换为相应的xml表示吗?
假设我有以下类型:
type A =
| FirstA of B list
| SecondA of C * string
type B = B1 | B2
type C = {
my_field: int;
}
Run Code Online (Sandbox Code Playgroud)
对于SecondA (C {my_field=10}, "just a value")我想得到的价值可能是这样的:
<A constructor="FirstA">
<C><my_field>10</my_field></C>
<string>just a value</string>
</A>
Run Code Online (Sandbox Code Playgroud)
有没有可以做这样的事情的图书馆?或者,如果我必须自己做,最好的方法是什么?请注意,我想将其应用于多种不同的数据类型.
我知道数据类型的通用编程技术,但在我的情况下它们太"重"了.
我在写一个与lhs中的枚举值匹配的规则时遇到了困难.
例如,如果我有以下枚举:
public enum EStatus {
OK,
NOT_OK
}
Run Code Online (Sandbox Code Playgroud)
我想用这样的东西:
rule "my rule"
dialect "java"
when
status : EStatus() // --> this works, but I want to be more specific
// status : EStatus(this == EStatus.OK) // --> doesn't work. How can I make it work?
then
// ...
end
Run Code Online (Sandbox Code Playgroud)
这在Drools中甚至可能吗?我使用的是5.1.1版.
我已经用很多表(大约40个)定义了我的数据库.我现在意识到我想在每个表中添加某些列.为了这个例子,让它成为
created_by和 updated_by.
有没有办法在不进行40次迁移的情况下轻松完成这些操作并手动更新每个迁移?
我正在使用rails 2.3.8