Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ocaml 如何获取'int->;(int->;int)`?_Ocaml - Fatal编程技术网

Ocaml 如何获取'int->;(int->;int)`?

Ocaml 如何获取'int->;(int->;int)`?,ocaml,Ocaml,这两种类型:int->int->int和int->(int->int)相同吗 如果我写让fx=funy->x+y+1,utop返回int->int->int。但我想要的是一个函数,它接受一个int作为参数,然后返回一个函数,这个函数也接受一个int并返回int,即,int->(int->int) 有办法吗 同样对于('a*'b->'c)->('a->'b->'c),我写了让f g=fun a b->g(a,b),但它返回('a*'b->'c)->'a->'b->'c,括号被删除。但是为什么呢 如

这两种类型:
int->int->int
int->(int->int)
相同吗

如果我写
让fx=funy->x+y+1
,utop返回
int->int->int
。但我想要的是一个函数,它接受一个int作为参数,然后返回一个函数,这个函数也接受一个int并返回int,即,
int->(int->int)

有办法吗

同样对于
('a*'b->'c)->('a->'b->'c)
,我写了
让f g=fun a b->g(a,b)
,但它返回
('a*'b->'c)->'a->'b->'c
,括号被删除。但是为什么呢


如果一个新函数作为结果返回,它是否会被转换?

通常,在lambda演算中,所有函数都有1个参数。接受两个参数(不是元组)的函数是接受一个参数并返回另一个函数的函数。如果你从这个角度来看这个问题,你就会明白
->
是右关联的。

通常,在lambda演算中,所有函数都有一个参数。接受两个参数(不是元组)的函数是接受一个参数并返回另一个函数的函数。如果你从这个角度看问题,你就会明白
->
是正确的关联。

是的,它们是相同的

你可以试一下,只要输入就可以了

let f x y = x + y + 1;;
val f : int -> int -> int = <fun>
# let g = f 1;;
val g : int -> int = <fun>
# let _ = List.map g [1;2;3];; (* would do the same with (f 1) instead of g *)
- : int list = [3; 4; 5]
设fxy=x+y+1;;
val f:int->int->int=
#设g=f1;;
val g:int->int=
#设u=List.map g[1;2;3];;(*将对(f1)而不是g*执行相同的操作)
-:int list=[3;4;5]

整个想法是函数默认为curryfied。由于
a->(b->c)
a->b->c
是等效的,它们被显示为尽可能轻的类型。

是的,它们是相同的

你可以试一下,只要输入就可以了

let f x y = x + y + 1;;
val f : int -> int -> int = <fun>
# let g = f 1;;
val g : int -> int = <fun>
# let _ = List.map g [1;2;3];; (* would do the same with (f 1) instead of g *)
- : int list = [3; 4; 5]
设fxy=x+y+1;;
val f:int->int->int=
#设g=f1;;
val g:int->int=
#设u=List.map g[1;2;3];;(*将对(f1)而不是g*执行相同的操作)
-:int list=[3;4;5]

整个想法是函数默认为curryfied。由于
a->(b->c)
a->b->c
是等效的,因此它们显示为可能的最轻类型。

是的,它们是相同的。箭头是右关联中缀构造函数,这就是为什么右括号是多余的

认识到这一点或许会有所帮助

let f x y z = e
只是语法上的糖

let f = fun x -> fun y -> fun z -> e

其他一切都从这里开始。

是的,它们是一样的。箭头是右关联中缀构造函数,这就是为什么右括号是多余的

认识到这一点或许会有所帮助

let f x y z = e
只是语法上的糖

let f = fun x -> fun y -> fun z -> e

其他所有内容都遵循此处的格式。

因此无法打印出
int->(int->int)
的类型。类型表达式打印机不会输出多余的括号。尝试
让f:int->(int->int)=(+)
因此无法打印出
int->(int->int)
的类型?类型表达式打印机写入时不会输出多余的括号。尝试
让f:int->(int->int)=(+)
->
是右关联的
->
是右关联的