1

JasonHickeyのObjectiveCaml入門を学んでいます。入れ子関数(カリー化)について質問があります。

Haskellの「カリー化」をどのように理解するかという既存の質問があります。、でも少し違う質問の答えを探していると思います。


それは私たちが次のように書くことができると言っていlet sum = fun i j -> i + j;;ますlet sum = fun i -> fun j -> i + j;;

私の質問は簡単です:

上記の定義を次のように理解できますlet sum = fun i -> i + fun j -> j;;か?

コンパイラを通過しないことはわかっていますが、この種のをにマップしようとしOCaml function definitionていmathematics functionsます。

私の上記の想像では、関数を数学で簡単に書くことができますf(i) = i + g(j); and g(j) = j

理解しやすいように、常にこの種のロジックマッピングを行う必要がありますか?

4

2 に答える 2

3

あなたの想像力は本当に正しくありません:ここで定義さf(i) = i + g(j)れていないほど多くの意味はありません。j

理解する正しい方法fun i j -> fooは、より明示的な表記のための便利な構文糖衣と見なすことfun i -> fun j -> fooです。

以下のすべての定義は完全に同等です:

let sum i j = i + j
let sum i = fun j -> i + j
let sum = fun i -> (fun j -> i + j)
let sum = fun i -> fun j -> i + j
let sum = fun i j -> i + j

let sum i =
  let add_i = fun j -> i + j in
  add_i

数学的には、これは関数空間の要素(ℕ→(ℕ→ℕ))として書くことができます(i↦(j↦i+ j))。

于 2012-12-03T12:39:50.443 に答える
1

OCaml 関数は、数学表記との間で直接マッピングできます。ただし、数学的表記はあいまいであることを認識する必要があります。f(i)特定の値 に対する関数 の値iと、関数f自体との間に明確な区別はありません。多くのf(i)場合、関数f自体を意味するときに書きます。(「関数 f(i)=i+1 を考えてみましょう... この関数は ...」) OCaml で正しいコードを書くには、関数自体を操作しているのか、値を操作しているのかを明確に確認する必要があります。関数の。

数学表記で「関数を考える」と言うとき、関数f(i,j)=i+g(j) where g(j)=jの値を書いているのです.OCamlでは、これは

  let f i j = 
       let g j = j in 
       i + g j;;

また

  let f = 
     let g = fun j -> j 
     in
     fun i j -> i + g j;;

を書き込もうとしている場合let sum = fun i -> i + fun j -> j;;、数学表記では、「g が によって定義される関数であるsumような関数を考えてください」と言っています。これは数学的に正しくありません。整数値関数を加算することはできません。整数と関数のを他の整数にのみ追加できます。表現 " " は、厳密に言えば未定義です。あなたが書きたかったか、または書きたかったのですが、そうではありませんでした。これは数学でもそうで、OCaml でもそうです。sum(i) = i + gg(j)=j i gigji+gi + g(i)i+g(j)i+g

于 2012-12-04T09:00:05.657 に答える