Functional programming OCaml输入类型

Functional programming OCaml输入类型,functional-programming,ocaml,Functional Programming,Ocaml,我正在学习OCaml,到目前为止,我很难理解类型的概念 例如,如果我们有以下代码: # let func x = x;; val func : 'a -> 'a = <fun> ('a->'b)是什么意思? 'a与f相关,而'b与x相关吗 另一个让我更加困惑的函数组合是: # let composition2 f x = f(f(x));; val composition2 : ('a -> 'a) -> 'a -> 'a = <fun> 让合

我正在学习OCaml,到目前为止,我很难理解类型的概念

例如,如果我们有以下代码:

# let func x = x;;
val func : 'a -> 'a = <fun>
('a->'b)
是什么意思?
'a
f
相关,而
'b
x
相关吗

另一个让我更加困惑的函数组合是:

# let composition2 f x = f(f(x));;
val composition2 : ('a -> 'a) -> 'a -> 'a = <fun>
让合成2 f x=f(f(x));; val组合2:('a->'a)->'a->'a= 我真的不明白为什么在这种情况下我们没有
'b


提前谢谢你

'a->'b
是一种函数类型,它接受一个
'a
类型的参数,并返回一个
'b
类型的值

val组合:('a->'b)->'a->'b
表示
composition
是两个参数的函数:

  • 第一个是类型
    ('a->'b)
    ,因此函数如上所述
  • 第二种类型为
    'a
  • 因此,此函数返回与第一个参数
    'b
    的返回类型相同的内容。实际上,它接受一个函数及其参数,并将该函数应用于该参数


    在第二种情况下,您可以从内部调用向后工作。让我们看看
    f(f(x))

  • x
    是任何类型的
    'b
    。我们还不知道这是什么类型的
  • 因为我们有
    f(x)
    f
    必须是
    'b->'c
    类型的函数。它是
    'b
    ,因为我们知道它需要
    x
    作为输入,
    x
    'b
    类型
  • 因此,
    composition2
    的类型是
    ('b->'c)->'b
  • 因为我们有
    f(f(x))
    ,所以
    f
    参数的类型必须与其返回值的类型相同。所以,
    'b=='c
    。将该类型称为
    'a
  • 由于
    x
    'b
    类型,与
    'a
    相同,
    x
    必须是
    'a
    类型
  • 由于
    f
    属于
    'b->'c
    类型,其中
    'b=='a
    'c=='a
    f
    必须属于
    'a->'a
    类型
  • 因此,
    composition2
    的类型是
    ('a->'a)->'a

  • 'a->'b
    是一种函数类型,它接受一个
    'a
    类型的参数,并返回一个
    'b
    类型的值

    val组合:('a->'b)->'a->'b
    表示
    composition
    是两个参数的函数:

  • 第一个是类型
    ('a->'b)
    ,因此函数如上所述
  • 第二种类型为
    'a
  • 因此,此函数返回与第一个参数
    'b
    的返回类型相同的内容。实际上,它接受一个函数及其参数,并将该函数应用于该参数


    在第二种情况下,您可以从内部调用向后工作。让我们看看
    f(f(x))

  • x
    是任何类型的
    'b
    。我们还不知道这是什么类型的
  • 因为我们有
    f(x)
    f
    必须是
    'b->'c
    类型的函数。它是
    'b
    ,因为我们知道它需要
    x
    作为输入,
    x
    'b
    类型
  • 因此,
    composition2
    的类型是
    ('b->'c)->'b
  • 因为我们有
    f(f(x))
    ,所以
    f
    参数的类型必须与其返回值的类型相同。所以,
    'b=='c
    。将该类型称为
    'a
  • 由于
    x
    'b
    类型,与
    'a
    相同,
    x
    必须是
    'a
    类型
  • 由于
    f
    属于
    'b->'c
    类型,其中
    'b=='a
    'c=='a
    f
    必须属于
    'a->'a
    类型
  • 因此,
    composition2
    的类型是
    ('a->'a)->'a

  • 现在说得很有道理。谢谢你的澄清!现在说得很有道理。谢谢你的澄清!这不是合成,这是应用。这不是合成,这是应用。
    # let composition2 f x = f(f(x));;
    val composition2 : ('a -> 'a) -> 'a -> 'a = <fun>