0

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

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

1 回答 1

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 1实际上是与 完全相同的函数plus1)。

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

在这种情况下,(plus1 40)您甚至不能将其作为f. f应该是一个函数,但(plus1 40)它是一个整数 (41),而不是一个函数。

(add 1)另一方面是一个函数,你确实可以将它作为f. 事实上,我在我的例子中就是这样做的。但是你不能做的是从中取回价值1。我的意思是,想象有一种方法可以做到这一点。如果你通过plus1而不是(add 1). 你应该从中得到什么?在 中没有捕获任何值plus1,因此实际上没有什么可取回的,但显然与asplus1一样有效。applyTwice(add 1)

这可能有意义的唯一方法是,如果部分应用的函数具有与普通函数不同的类型,则允许您定义一个接受(add 1)作为一个参数的函数,但不是plus1。然而,ML 并非如此,它并没有太多好处。拥有不同类型的函数只会使类型系统更复杂,并且更难以定义高阶函数(因为它们必须能够处理这两种类型的函数)。我也看不到这种能力甚至会有所帮助的用例。

于 2016-10-12T19:05:51.660 回答