基本上,我想做的是:
我有一个函数square(x)(define (square x) (* x x))
(f(x)= x * x),另一个函数mul_two (define (mul_two x) (* 2 x))
(g(x)= 2 * x),我想要基于上述两个函数构造一个新函数,新函数的作用是:2*(x*x)
(p(x)= g(f(x))),如何在scheme中编写这个新函数?虽然它在数学形式上非常直接,但我完全坚持这一点。
答案 0 :(得分:3)
(define (new_fun x) (mul_two (square x)))
编辑:
(define (square x) (* x x))
(define (mul_two x) (* 2 x))
(define (new_fun fun1 fun2) (lambda (x) (fun2 (fun1 x))))
((new_fun square mul_two) 10)
你将得到200.(10 * 10 * 2)
此外,您可以像在球拍中撰写一样实现通用 my-compose 功能:
(define (my-compose . funcs)
(let compose2
((func-list (cdr funcs))
(func (lambda args (apply (car funcs) args))))
(if (null? func-list)
func
(compose2
(cdr func-list)
(lambda args (func (apply (car func-list) args)))))))
你可以通过以下方式获得新的乐趣:
(define new-fun (my-compose mul_two square))
答案 1 :(得分:3)
通常使用compose
来执行您要求的操作,根据链接文档:
返回组成给定函数的过程,首先应用最后
proc
,最后应用proc
。
请注意compose
非常强大,它允许我们传递任意数量的函数,这些函数使用并生成任意数量的值。但是您的示例很容易实现:
(define (square x) ; f(x)
(* x x))
(define (mul_two x) ; g(x)
(* 2 x))
(define p ; g(f(x))
(compose mul_two square))
(p 3) ; same as (mul_two (square 3))
=> 18
如果出于某种原因,您的Scheme解释器没有内置compose
,则很容易编写代码 - 如果我正确理解了对其他答案的评论,那么您希望使用{{3 }}。让我们为一个简单的例子写一个,每个函数只生成/消耗一个值,并且只编写两个函数:
(define my-compose ; curried and simplified version of `compose`
(lambda (g)
(lambda (f)
(lambda (x)
(g (f x))))))
(define p ; g(f(x))
((my-compose mul_two) square))
(p 3) ; same as (mul_two (square 3))
=> 18
答案 2 :(得分:0)
在#!racket(语言)中compose
使用:
(define double-square (compose double square))
这与执行此操作相同:
(define (double-square . args)
(double (apply square args)))
如果您想使用Scheme(标准),您可以自己动手:
#!r6rs
(import (rnrs))
(define (compose . funs)
(let* ((funs-rev (reverse funs))
(first-fun (car funs-rev))
(chain (cdr funs-rev)))
(lambda args
(fold-left (lambda (arg fun)
(fun arg))
(apply first-fun args)
chain))))
(define add-square (compose (lambda (x) (* x x)) +))
(add-square 2 3 4) ; ==> 81