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) );;

そして、私は次のように呼び出したいmyfunc2: let 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は の 2 乗でnあり、はその引数gに追加する関数です。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_bad2 つの引数が必要になりました。1 つだけを指定すると、ペアは取得されず、他の引数を期待する関数が取得されます。そして、その引数を与えると、2 つの整数のペアを返します。これは、(m, g k)「最初のコンポーネントが整数mで、2 番目のコンポーネントが にg 適用されるkペアを作成するため、それも整数である」という意味だからです。

もう 1 つの重要な点は、2 つの異なるものを呼び出すことで自分自身を混乱させているということですpara2。の定義でf_badは、2 つの異なるものを呼び出すことによって、自分自身を混乱させkます。のk定義に現れる はg、他の と同じではありませんkk2つの異なるものを呼び出す方が良いです:

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 に答える