SML:从其类型解释函数

SML:从其类型解释函数,sml,smlnj,Sml,Smlnj,我不熟悉SML(元语言)。 谁能告诉我如何从下面给出的类型派生函数: ('a->'b)->('b list->'c)->'a->'c list 我很难理解SML中的curried函数。这将起作用 - fun f g h x = [h [g x]]; > val ('a, 'b, 'c) f = fn : ('a -> 'b) -> ('b list -> 'c) -> 'a -> 'c list 我是这样做的 我们被赋予了这种类型 ('a -> 'b)

我不熟悉SML(元语言)。 谁能告诉我如何从下面给出的类型派生函数: ('a->'b)->('b list->'c)->'a->'c list

我很难理解SML中的curried函数。

这将起作用

- fun f g h x = [h [g x]];
> val ('a, 'b, 'c) f = fn : ('a -> 'b) -> ('b list -> 'c) -> 'a -> 'c list
我是这样做的

我们被赋予了这种类型

('a -> 'b) -> ('b list -> 'c) -> 'a -> 'c list
所以我们知道我们想要一个有三个参数的函数,前两个是函数,第三个是任何东西。所以我们写:

fun f g h x = ....
现在,第一个参数是一个函数,它接受了
'a
类型的东西,x是我们想要的

g x
在右手边。这将是
'b
类型。现在
h
接受了一个
'b列表
,因此我们可以编写

h [g x]
这将生成一个类型为
'c
的值,但我们希望
f
返回一个
'c列表,因此我们将其放入一个列表中,得到:

fun f g h x = [h [g x]];
这会奏效的

- fun f g h x = [h [g x]];
> val ('a, 'b, 'c) f = fn : ('a -> 'b) -> ('b list -> 'c) -> 'a -> 'c list
我是这样做的

我们被赋予了这种类型

('a -> 'b) -> ('b list -> 'c) -> 'a -> 'c list
所以我们知道我们想要一个有三个参数的函数,前两个是函数,第三个是任何东西。所以我们写:

fun f g h x = ....
现在,第一个参数是一个函数,它接受了
'a
类型的东西,x是我们想要的

g x
在右手边。这将是
'b
类型。现在
h
接受了一个
'b列表
,因此我们可以编写

h [g x]
这将生成一个类型为
'c
的值,但我们希望
f
返回一个
'c列表,因此我们将其放入一个列表中,得到:

fun f g h x = [h [g x]];

你能澄清这个问题吗?有无限多的函数具有这种类型。你不能给出一个类型,然后说“给出具有这个类型的函数”。它们的数量是无限的。不过,走另一条路是可行的。如果您使用SML编写函数,则可以计算其类型。也许您正在寻找具有该类型的函数?这就是你要问的吗?嗨@RayToal,是的。它可以是任何函数,只要它满足此类型。另外,如果你能解释一下如何从函数的类型中推断出函数,那就太好了。正如我所看到的,有三种不同的类型:'a'b'c我可以写这样的东西:fun foo a b c=b[a c];这是不正确的,但可能是这样的?是的,非常接近(正如你从下面的答案中看到的)。好的开始!你能澄清这个问题吗?有无限多的函数具有这种类型。你不能给出一个类型,然后说“给出具有这个类型的函数”。它们的数量是无限的。不过,走另一条路是可行的。如果您使用SML编写函数,则可以计算其类型。也许您正在寻找具有该类型的函数?这就是你要问的吗?嗨@RayToal,是的。它可以是任何函数,只要它满足此类型。另外,如果你能解释一下如何从函数的类型中推断出函数,那就太好了。正如我所看到的,有三种不同的类型:'a'b'c我可以写这样的东西:fun foo a b c=b[a c];这是不正确的,但可能是这样的?是的,非常接近(正如你从下面的答案中看到的)。好的开始!