3

このコードを次のように使用したい: 入力した場合:

((function1 5) 2)

ここで、 function1 は に基づいてそのプロシージャを実行し、に基づいて何かを実行する を5返します。これは可能ですか?function22

4

4 に答える 4

10
(define (multiplyBy n) (lambda (x) (* n x)))
((multiplyBy 5) 2)

私はあなたがやろうとしていることをすると信じています。

于 2012-09-18T17:51:51.310 に答える
1

@zebediah49 の例を続けて、これを行う別の方法を次に示します。

(define (multiplyBy n) ((curry *) n))
((multiplyBy 5) 2)
> 10

一般に、引数が 2 つの関数の場合 (上記の例は、引数が 1 つ以上の関数であるため、少し異なり*ます):

(define (function1 arg0) (curry <function2, receives arg1> arg0))

curry手順のドキュメントを引用:

のカリー化バージョンであるプロシージャを返しますproc。結果のプロシージャが最初に適用されるとき、受け入れることができる最大数の引数が与えられない限り、結果は追加の引数を受け入れるプロシージャになります。

基本的に、カリー化の実装を求められています。ウィキペディアの記事を引用:

数学とコンピューター サイエンスでは、カリー化とは、複数の引数 (または引数の n タプル) を取る関数を、それぞれが 1 つの引数を持つ一連の関数として呼び出せるように変換する手法です (部分適用)。 . Moses Schönfinkel によって考案され、後に Haskell Curry によって再発見されました。このため、シェーンフィンケリングと名付けた方が正しいと言う人もいます。

これらはすべて同等であることに注意してください。

(define ((function1 arg0) arg1) <body>)
(define (function1 arg0) (lambda (arg1) <body>))
(define (function1 arg0) (curry <function2, receives arg1> arg0))
(define (function1 arg0) (define (function2 arg1) <body>) function2)
于 2012-09-18T20:09:38.500 に答える
1

私は周りに尋ねました、そして私が見つけたのは、次のような関数を定義できるということです:

(define ((function1 arg0) arg1) (;procedure here...))

これが私が欲しかったものです。結局、プロシージャを返す関数を実際に取得していなかったと思います... :/ でも、助けてくれてありがとう! :)

于 2012-09-18T23:50:46.797 に答える
0

これらの回答の多くは、関数から関数を返すさまざまな方法を正しく示しています。より一般的には、あなたがしていることはカリー化と呼ばれます。より具体的には、「カリー化」とは、n 個の引数を取る関数を 1 個の引数を取る関数に変換し、n-1 個の引数を取る新しい関数を返すプロセスを指します。

初心者の学生にとって、私にとって最も素敵に見えるスタイルは次のとおりです。

#lang racket

;; a curried function that multiplies two numbers
(define (function1 arg0)
  (define (function2 arg1) 
    (* arg0 arg1))
  function2)

この関数は、引数 (arg0) を受け取り、arg0 と arg1 を乗算して返す 1 つの引数 (arg1) の新しい関数を定義します。

これはラムダを使用したものほど短くはありませんが、始めたばかりのときは、ラムダは意味をなさないもう 1 つの奇妙なことのように思えるかもしれません。

于 2012-09-19T06:14:16.020 に答える