如何在SML

时间:2016-10-12 19:02:50

标签: arguments sml mosml

我是编码SML的新手,我仍在尝试理解模式匹配。我试图找出如何从作为SML中的参数传递的函数访问参数。例如,如果一个函数有两个参数,一个函数和一个整数,我怎样才能访问参数函数所具有的参数(为简单起见,假设它只有一个参数)。这个问题在SML中是否有意义?这是一些不起作用的代码,但我认为它说明了我要做的事情。

fun argumentExtraction (n,f) =
    case f of
        fn x => x

1 个答案:

答案 0 :(得分:0)

一个函数没有参数,它接受参数。您为函数提供参数,然后返回结果。你不能问函数它的论点是什么,因为它还没有它们。你应该给函数提供参数。

为了使这一点更清楚,让我们考虑一个例子。我们采取以下功能:

fun add x y = x + y
fun plus1 x = x + 1

fun applyTwice f x = f (f x)

现在applyTwice接受一个函数和一个参数,并将该函数应用于参数两次。我们可以这样称呼它:

applyTwice plus1 40

或者像这样:

applyTwice (add 1) 40

并且在这两种情况下答案都是42(因为plus1 (plus1 40)add 1 (add 1 40)的价值,add 1plus1的功能完全相同{1}})。

现在我不确定您是否希望能够将(plus1 40)作为f的值传递,然后以某种方式获取40或者是否要传递(add 1)然后以某种方式取回1,但两者都不可能。

如果是(plus1 40),您甚至无法将其作为f的值传递。 f应该是一个函数,但(plus1 40)是一个整数(41),而不是函数。

另一方面,

(add 1)是一个函数,您确实可以将其作为f的值传递。事实上,我在我的例子中这样做了。但是你不能做的就是从中获取值1。我的意思是,想象有一种方法可以做到这一点。如果您通过plus1而不是(add 1),应该怎么办?你应该从那里得到什么?在plus1中没有捕获任何值,因此无法回复,但显然plus1applyTwice的{​​{1}}一样有效。

这可能有意义的唯一方法是,如果部分应用的函数具有与普通函数不同的类型,则允许您定义一个接受(add 1)作为一个参数的函数,而不是(add 1)。然而,ML并不是这样的情况,并且实际上并没有太大的好处。具有不同类型的函数将使类型系统更复杂并且使得更高级函数的定义变得更加困难(因为它们必须能够处理这两种类型的函数)。我也没有看到这种能力甚至有用的用例。