我是 SML 编码的新手,仍在尝试理解模式匹配。我试图找出如何从在 SML 中作为参数传递的函数访问参数。例如,如果一个函数有 2 个参数,一个函数和一个整数,我如何访问参数函数具有的参数(为简单起见,假设它只有一个)。这个问题在 SML 中是否有意义?这是一些代码,它不起作用,但我认为它说明了我正在尝试做的事情。
fun argumentExtraction (n,f) =
case f of
fn x => x
函数没有参数,它需要参数。你给函数提供参数,你会得到一个结果。你不能问函数它的参数是什么,因为它还没有参数。您应该为函数提供参数。
为了让这可能更清楚一点,让我们考虑一个例子。让我们采用以下功能:
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 并非如此,它并没有太多好处。拥有不同类型的函数只会使类型系统更复杂,并且更难以定义高阶函数(因为它们必须能够处理这两种类型的函数)。我也看不到这种能力甚至会有所帮助的用例。