如何在SML中将参数声明为函数?

如何在SML中将参数声明为函数?,sml,smlnj,Sml,Smlnj,我的问题是这样的: 我如何定义一个函数,它接收函数时不使用类型约束,或者换句话说,不必键入fun f1(f2:type->type)? 我试图想出一种方法,将参数f2作为函数使用,但它没有任何作用。 有什么想法吗?对于一个函数,你能做的一件事是调用它,而对于其他任何值,你都做不到。因此,将f2用作函数意味着调用它——也就是说,将其应用于参数 例如,您可以将f1定义为: fun f1 f2 = f2 42 而f1的推断类型将是(int->'a)->'a(使f2的类型成为int->'a)。对一个函

我的问题是这样的: 我如何定义一个函数,它接收函数时不使用类型约束,或者换句话说,不必键入fun f1(f2:type->type)? 我试图想出一种方法,将参数f2作为函数使用,但它没有任何作用。
有什么想法吗?

对于一个函数,你能做的一件事是调用它,而对于其他任何值,你都做不到。因此,将
f2
用作函数意味着调用它——也就是说,将其应用于参数

例如,您可以将
f1
定义为:

fun f1 f2 = f2 42

f1
的推断类型将是
(int->'a)->'a
(使
f2的类型成为
int->'a
)。

对一个函数可以做的一件事是调用它,而对任何其他值都做不到。因此,将
f2
用作函数意味着调用它——也就是说,将其应用于参数

例如,您可以将
f1
定义为:

fun f1 f2 = f2 42

f1
的推断类型将是
(int->'a)->'a
(使
f2的类型成为
int->'a
)。

通过返回匿名函数,您可以这样做,结果函数可以接受任意函数作为输入(尽管不是以非常有用的方式):

这使得
id
成为一个高阶函数,该函数返回其未修改的输入函数。
id
的类型是
fn:('a->'b)->'a->'b

作为“使用”的一个例子:

一个稍微有趣的示例,只适用于
'A->'A
类型的函数:

 fun self_compose f = fn x => f (f x)

通过返回匿名函数,您可以这样做:结果函数可以接受任意函数作为输入(尽管不是很有用):

这使得
id
成为一个高阶函数,该函数返回其未修改的输入函数。
id
的类型是
fn:('a->'b)->'a->'b

作为“使用”的一个例子:

一个稍微有趣的示例,只适用于
'A->'A
类型的函数:

 fun self_compose f = fn x => f (f x)


非常感谢!我设法编写了我想要的,但我仍然不明白,你提到的格式是函数接收一个函数并返回另一个函数,但是如果我想要一个函数接收一个函数:a->b并返回一个函数接收一个函数:a->b并返回b呢?换句话说,函数类型是:('a->'b)->('a->'b)->'bI不明白这是怎么可能的。类型为
'A->'b
的函数是获取类型为
'A
的值并将其映射到类型为
'b
的值的一种方法。所以要得到第二种类型的值,需要第一种类型的值。您似乎希望找到一种直接从函数本身获取第二种类型的值的方法,而无需任何实际输入。这真的没有意义。我不知道它是否会改变任何东西,但我正在寻找的确切类型是:('a->'b)->('a*'b->'b)->'b完全理解你的意思,如果没有输入类型为'a->'b的函数,我无法接收类型为'b的结果,这是我的问题。但是,我被要求这样做,不管函数本身做什么,只要它的类型是我提到的类型。(我仔细检查)我设法解决了这个问题,这个命令是:funha=fnb=>fngg=>g(a,g(a,b));非常感谢!我设法编写了我想要的,但我仍然不明白,你提到的格式是函数接收一个函数并返回另一个函数,但是如果我想要一个函数接收一个函数:a->b并返回一个函数接收一个函数:a->b并返回b呢?换句话说,函数类型是:('a->'b)->('a->'b)->'bI不明白这是怎么可能的。类型为
'A->'b
的函数是获取类型为
'A
的值并将其映射到类型为
'b
的值的一种方法。所以要得到第二种类型的值,需要第一种类型的值。您似乎希望找到一种直接从函数本身获取第二种类型的值的方法,而无需任何实际输入。这真的没有意义。我不知道它是否会改变任何东西,但我正在寻找的确切类型是:('a->'b)->('a*'b->'b)->'b完全理解你的意思,如果没有输入类型为'a->'b的函数,我无法接收类型为'b的结果,这是我的问题。但是,我被要求这样做,不管函数本身做什么,只要它的类型是我提到的类型。(我仔细检查)我设法解决了这个问题,这个命令是:funha=fnb=>fngg=>g(a,g(a,b));谢谢然而,我正在寻找一种解决方案,它包括多态函数,而不必使用任何特定的函数number@Basilm这就是一个例子。你可以用任何你想要的参数来调用它。我理解,但在你的例子中,你使用了一个参数,它是一个数字,不需要作为参数接收。我是SML的初学者,但是如果我想要一个多态函数,它不迫使我接收一个额外的参数(a),这样我就可以做f2 a吗?@Basilm是的,定义
('a->'b)->'b
(这似乎是你现在要求的)或任何类似的函数的唯一方法都会涉及异常或无限递归。谢谢!然而,我正在寻找一种解决方案,它包括多态函数,而不必使用任何特定的函数number@Basilm这就是一个例子。你可以用任何你想要的参数来调用它。我理解,但在你的例子中,你使用了一个参数,它是一个数字,不需要作为参数接收。我是SML的初学者,但是如果我想要一个多态函数,它不会强迫我接收一个额外的参数(a),这样我就可以做f2 a吗?@Basilm是的,定义类型为
('a->'b)->'b
(这似乎是你想要的)的函数的唯一方法