小编Pas*_*uoq的帖子

OCaml中函数声明的语法

我想定义一个函数如下:

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

8
推荐指数
1
解决办法
5924
查看次数

在OCaml中编写漂亮的多级嵌套if-then-else代码?

在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)

ocaml if-statement

8
推荐指数
2
解决办法
4658
查看次数

OCaml:为什么比较运算符是类型不可知的,而算术运算符不是?

我想知道为什么<operator支持int,string,bool或float,而+只支持int.

OCaml可以识别要使用的基础算术吗?什么使比较运算符与算术运算符不同?其他FP语言是否相同?

ocaml functional-programming

8
推荐指数
2
解决办法
427
查看次数

Win32文件已锁定以供阅读:如何找出锁定它们的人

在C++中(特别是在Visual C++上),有时您无法打开文件,因为另一个可执行文件已打开并且没有共享它以进行读取.如果我尝试打开这样的文件,我怎么能以编程方式找出锁定文件的人?

c++ file-io winapi visual-c++

7
推荐指数
2
解决办法
5041
查看次数

桌面操作系统上的C编译器使用多少个内存页来检测堆栈溢出?

这个问题涉及但来自不同这一个约在C99可变长度数组.

答案指出,在堆栈中分配可变长度数组(或者只是固定大小的大数组)的一个危险是分配可能会无声地失败,而不是调用malloc,这显然告诉调用者分配是否成功.

现代非嵌入式编译平台使用无效的内存区域来检测一些堆栈溢出,而无需额外成本(检查只是MMU已经免费进行的检查).这不能保证100%免受上述问题的影响,因为非常大的本地数组可能导致堆栈指针跳过无效区域.

有没有人知道通常会为此检测分配多少页?我想这至少是4KiB,但它可能会更多.这是由编译器或操作系统做出的选择,在任何一种情况下,有没有办法改变它?

c c99 variable-length-array mmu

7
推荐指数
2
解决办法
347
查看次数

功能编程功能混乱

我正在学习函数式编程,并且正在使用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的函数式编程,请不要吃我:)

ocaml functional-programming

7
推荐指数
1
解决办法
170
查看次数

在OCaml中,ghci的类型指令相当于什么?

在ghci中,您可以使用type指令找出任何表达式的类型.

例如,如果我想找出类型\ 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是否有相同的功能?

ocaml haskell types

7
推荐指数
2
解决办法
667
查看次数

OCaml - 什么数据类型是一些,没有?

如果我在列表中使用SomeNone组合什么是列表的数据类型?它总是'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,它仍然编译,但列表结构没有"选项"标志,我猜这意味着可选(我似乎无法在互联网上找到任何关于这个).有人能为我提供一个有用的案例吗?

ocaml types

7
推荐指数
2
解决办法
2万
查看次数

为什么C代码中的1.0f在生成的程序集中表示为1065353216?

在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

c floating-point assembly nasm

7
推荐指数
2
解决办法
2938
查看次数

双精度到十进制,15位后没有舍入

将"高"精度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位后的舍入?

c# precision double decimal

7
推荐指数
1
解决办法
1582
查看次数