我想定义一个函数如下:
let f (a: int) (b: int) (c: int) (d: int): int =
...
Run Code Online (Sandbox Code Playgroud)
是否可以缩短签名而不使其成为元组?因为我仍然希望f有4个参数.
非常感谢你.
编辑1:我认为重复int4次是没用的,并且想象出let f (a, b, c, d: int): int目前实际上不允许的东西.
在OCaml中,如果我必须使用许多if-then-else编写函数,下面是我的愚蠢和丑陋的解决方案.
let foo () =
let a1 = ... in
if (a1) then
result1
else
let a2 = ... in
if (a2) then
result2
else
let a3 = ... in
if (a3) then
result3
else
let a4 = ... in
if (a4) then
result4
else
result5.
Run Code Online (Sandbox Code Playgroud)
如何美化上面的代码?我喜欢C/C++和Java风格,它使用"return"来保存下一个if语句的缩进.我可以用OCaml做同样的事情吗?
int foo () = {
bool a1 = ...;
if (a1)
return result1;
bool a2 = ...;
if (a2)
return result2;
bool a3 = ...;
if (a3)
return result3;
bool a4 = ...; …Run Code Online (Sandbox Code Playgroud) 我想知道为什么<operator支持int,string,bool或float,而+只支持int.
OCaml可以识别要使用的基础算术吗?什么使比较运算符与算术运算符不同?其他FP语言是否相同?
在C++中(特别是在Visual C++上),有时您无法打开文件,因为另一个可执行文件已打开并且没有共享它以进行读取.如果我尝试打开这样的文件,我怎么能以编程方式找出锁定文件的人?
这个问题涉及但来自不同这一个约在C99可变长度数组.
答案指出,在堆栈中分配可变长度数组(或者只是固定大小的大数组)的一个危险是分配可能会无声地失败,而不是调用malloc,这显然告诉调用者分配是否成功.
现代非嵌入式编译平台使用无效的内存区域来检测一些堆栈溢出,而无需额外成本(检查只是MMU已经免费进行的检查).这不能保证100%免受上述问题的影响,因为非常大的本地数组可能导致堆栈指针跳过无效区域.
有没有人知道通常会为此检测分配多少页?我想这至少是4KiB,但它可能会更多.这是由编译器或操作系统做出的选择,在任何一种情况下,有没有办法改变它?
我正在学习函数式编程,并且正在使用Ocaml,但是我遇到了一些函数问题.
无论如何,我有一个元组,我想返回它的第一个值.(很简单,我知道,对不起)
let bach (x,y):(float*float) = (x,y);;
val bach : float * float -> float * float = <fun>
Run Code Online (Sandbox Code Playgroud)
一切都很好,在这里很好.
let john (x,y):(float*float) = y;;
val john : 'a * (float * float) -> float * float = <fun>
Run Code Online (Sandbox Code Playgroud)
现在这让我很困惑.为什么'a那里?我知道它代表一个类型未知的变量,但我很困惑如何更改返回值.
我是一个自称n00b的函数式编程,请不要吃我:)
例如,如果我想找出类型\ f g h -> g (h f),我可以使用ghci解释器中的指令,如下所示:
Prelude> :t \ f g h -> g (h f)
\ f g h -> g (h f) :: t2 -> (t1 -> t) -> (t2 -> t1) -> t
Run Code Online (Sandbox Code Playgroud)
OCaml是否有相同的功能?
如果我在列表中使用Some和None组合什么是列表的数据类型?它总是'a吗?或者是某种类型的Some/ None?
let listVar : (* type here *) list = [Some 4; Some 3; None; Some 2];;
Run Code Online (Sandbox Code Playgroud)
如果我把int它给我错误:
此表达式具有int选项*int option*'a option*int选项,但此处与int类型一起使用
当我把'a它编译得很好但基本的OCaml教程说(我引用其他语言来更好地解释我的问题):
目前尚不清楚为什么多态函数是有用的,但它们非常有用且非常常见,因此我们稍后将讨论它们. (提示:多态性有点像C++中的模板或Java 1.5中的泛型).
我认为这就像其他语言中的引用/指针一样,实际上是有道理的.但现在,我真的不明白是什么类型None.同样如此Some.
另外,我知道我应该在一个问题中提出两个问题,但这个问题与前一个问题有很强的关系.有些人有什么意义?我经常看到在使用None时使用它.如果我实现上面的列表没有Some,它仍然编译,但列表结构没有"选项"标志,我猜这意味着可选(我似乎无法在互联网上找到任何关于这个).有人能为我提供一个有用的案例吗?
在CI中有这个代码块:
if(x==1){
a[j][i]=1;
}
else{
a[j][i]=0;
}
Run Code Online (Sandbox Code Playgroud)
a 是一个浮点值矩阵,如果我试图在nasm语法中看到此代码的编译程序集
行a[j][i]=0;分配,以这种方式编码
dword [rsi+rdi], 0
Run Code Online (Sandbox Code Playgroud)
但行a[j][i]=1;分配是以这种方式编码的
dword [rsi+rdi], 1065353216
Run Code Online (Sandbox Code Playgroud)
1065353216如何代表1.0f?
将"高"精度Double转换为Decimal时,由于Rounding,我将使用Convert.ToDecimal或转换为(Decimal)而失去精度.
示例:
double d = -0.99999999999999956d;
decimal result = Convert.ToDecimal(d); // Result = -1
decimal result = (Decimal)(d); // Result = -1
Run Code Online (Sandbox Code Playgroud)
Convert.ToDecimal(double)返回的Decimal值最多包含15位有效数字.如果value参数包含超过15个有效数字,则使用舍入舍入为最接近的数字.
所以为了保持我的精度,我必须将我的double转换为String然后调用Convert.ToDecimal(String):
decimal result = System.Convert.ToDecimal(d.ToString("G20")); // Result = -0.99999999999999956d
Run Code Online (Sandbox Code Playgroud)
这个方法是有效的,但是我想避免使用String变量来将Double转换为Decimal而不用15位后的舍入?