1

最终我想要的是 x 代表什么: let x = (something, (myfunc1 para1));; 这样调用时x,我得到一个元组,但调用时(snd x) para,我会得到一个返回值myfunc1 para

我正在尝试的是这样的:

let myfunc2 para1 para2 = 
  let myfunc1 para2 = ... in
  ( (fst para1), (myfunc1 para2) );;

我想这样打电话myfunc2let x = myfunc2 para1得到我上面描述的。但是,我得到的只是一个函数,当使用 para1 调用时将返回一个常规元组,而不是一个(something, function)元组

4

1 回答 1

3

您的定义中有一个无用的para2参数。正确的方法是:

let myfunc2 para1 = 
  let x = ... in
  let myfunc1 para2 = ... in
  ( x, myfunc1 );;

但如果我们能谈谈一个具体的例子,那将会有所帮助。你误解了一些明显的东西,但我不知道是什么。

这是一个具体的例子。假设我们想要一个函数f,它接受一个数字n并返回一个对(m, g),其中m是的平方ng是一个添加n到其参数的函数:

let f n =
  let m = n * n in
  let g k = n + k in
    (m, g)

或更短:

let f n = (n * n, fun k => n + k)

现在要使用它,我们可以这样做:

let x = f 10 ;;
fst x ;; (* gives 100 *)
snd x ;; (* gives <fun> *)
snd x 5 ;; (* gives 15, and is the same thing as (snd x) 5 *)

现在让我们考虑以下错误的解决方案,其中我们犯了您所犯的错误:

let f_bad n k =
  let m = n * n in
  let g k = n + k in
    (m, g k)

现在f_bad想要两个论点。如果我们只给它一个,我们将不会得到一对,而是一个期待另一个参数的函数。当我们给它这个参数时,它会返回一对两个整数,因为这(m, g k)意味着“制作一对,其第一个分量是整数m,第二个分量g 应用于k,所以它也是一个整数。”

另一点值得说明的是,您通过调用两个不同的事物来混淆自己para2。在我们的定义中,f_bad我们还通过调用两个不同的事物来混淆自己k。的k定义中出现的g和其他的不一样k。最好将两者k的不同事物称为:

let f_bad n k1 =
  let m = n * n in
  let g k2 = n + k2 in
    (m, g k1)

现在,这有助于消除混乱吗?

于 2013-01-22T07:43:40.450 回答