7

私はこのcurry機能を持っています:

(define curry
(lambda (f) (lambda (a) (lambda (b) (f a b)))))

みたいだと思います(define curry (f a b))

consElem2All私の課題は、を使用して関数を書くことです。これは次のcurryように機能するはずです

(((consElem2All cons) 'b) '((1) (2 3) (4)))
>((b 1) (b 2 3) (b 4))

私は通常の方法でこの関数を書きました:

(define (consElem2All0 x lst) 
  (map (lambda (elem) (cons x elem)) lst))

しかし、それを で変換する方法がまだわかりませんcurry。誰でも私を助けることができますか?

前もって感謝します

ベアツク

4

3 に答える 3

4

カリー化について読むことから始めるべきです。カレーとは何かを理解していないと、とても使いにくいかもしれません... あなたの場合、http: //www.engr.uconn.edu/~jeffm/Papers/curry.html始める。

カリー化の非常に一般的で興味深い用途の 1 つは、reduce や map などの関数 (それ自体またはその引数) を使用することです。

2 つのカリー化演算子を定義しましょう。

(define curry2 (lambda (f) (lambda (arg1) (lambda (arg2) (f arg1 arg2)))))
(define curry3 (lambda (f) (lambda (arg1) (lambda (arg2) (lambda (arg3) (f arg1 arg2 arg3))))))

次に、いくつかのカリー化された数学関数:

(define mult (curry2 *))
(define double (mult 2))

(define add (curry2 +))
(define increment (add 1))
(define decrement (add -1))

そして、カリー化されたreduce / mapが来ます:

(define creduce (curry3 reduce))
(define cmap (curry2 map))

それらを使用する

最初にユースケースを減らします:

(define sum ((creduce +) 0))
(sum '(1 2 3 4)) ; => 10

(define product (creduce * 1))
(product '(1 2 3 4)) ; => 24

次に、ユースケースをマッピングします。

(define doubles (cmap double))
(doubles '(1 2 3 4)) ; => (2 4 6 8)

(define bump (cmap increment))
(bump '(1 2 3 4)) ; => (2 3 4 5)

カリー化の有用性を理解するのに役立つことを願っています...

于 2011-07-14T17:05:38.400 に答える
1

したがって、カレーのバージョンは 2 つの引数を持つ関数を受け取ります。たとえば、次のようにします。

(define (cons a b) ...)

そして、それを次のように呼び出すことができるものに変えます:

(define my-cons (curry cons))
((my-cons 'a) '(b c)) ; => (cons 'a '(b c)) => '(a b c)

実際には、3 つの引数を取る関数があります。3 項関数を管理する があればcurry3、次のようなことができます。

(define (consElem2All0 the-conser x lst) ...)

(あなたがしたように、cons 以外の cons のような関数を使用できるようにします!)

そして、これを行います:

(define consElem2All (curry3 consElem2All0))

curry3あなたは手元にそのようなものを持っていません。したがって、それを作成するか、追加の変数を自分で「手動で」カリー化して回避することができます。回避策は次のようになります。

(define (consElem2All0 the-conser)
  (lambda (x lst) ...something using the-conser...))
(define (consElem2All the-conser)
  (curry (consElem2All0 the-conser)))

マップ式自体でカリーを使用する方法がもう 1 つあります。これは、コンスにラムダをラップして要素をコンスに渡すことによって暗示されます。マップに直接使用できる引数が 1 つの関数を取得するにはxどうすればよいでしょうか?...cons

于 2011-06-26T22:57:37.763 に答える
-1
(define (consElem2All0 x lst) 
  (map ((curry cons) x) lst))
于 2011-06-29T14:18:04.450 に答える