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)=(+)代码>->
是右关联的->
是右关联的