문제
이건 숙제라서 답을 듣고 싶지 않아요.올바른 방향으로 밀어주기만 하면 됩니다.여러 함수를 목록에 매핑해야 합니다.예를 들어:
(map-multi (list plus-one square) '(4 5 6)) => (25 36 49)
첫 번째 함수를 목록의 요소에 매핑하도록 할 수 있지만 그 이후에는 매우 혼란스럽습니다.또한 입문용이므로 입문기능에 국한합니다(const
, append
, car
, cdr
, member
, 등.)
(define (map-multi f l)
(cond
((null? l)
l)
(else (cons ((car f) (car l))
(map-multi f (cdr l))))))
해결책
당신은 구성하다 귀하가 받는 기능은 f
매개변수.단순화를 위해 목록에 두 개의 함수만 있다고 가정해 보겠습니다. 그런 다음 숫자 목록의 현재 요소에 첫 번째 함수를 적용한 다음 그 결과에 두 번째 함수를 적용해야 합니다.당신이 사용할 수 있다면 compose
절차를 진행하고 코드에서 다음 줄을 변경하십시오.
((car f) (car l)) ; you're applying only the 1st function! what about the 2nd?
...이것으로 :
((compose (cadr f) (car f)) (car l)) ; now we're applying both functions
사용할 수 없는 경우 compose
, 같은 줄을 다음 줄로 바꿉니다.
((cadr f) ((car f) (car l))) ; now we're applying both functions
이제 문제가 더 일반적이고 다음과 같이 함수 목록을 매핑해야 하는 경우 2개 이상 그런 다음 코드의 동일한 줄을 다음과 같이 한 번 더 바꿉니다.
((compose-multi f) (car l))
그리고 다음을 연속적으로 호출하여 목록의 모든 함수를 구성하고 반환하는 도우미 함수를 구현합니다. compose
.이것은 숙제이므로 연습용으로 남겨 둡니다. 그러나 위 코드가 두 가지 함수에 대해 어떻게 작동하는지 이해했다면 결과를 여러 함수 목록으로 확장하는 것이 충분히 쉬울 것입니다.
(define (compose-multi flist) ; procedure for composing a list of functions
(if (null? flist) ; if the list is empty then
<???> ; return the identity function
(<???> (compose-multi <???>) ; else compose the result of recursive call
<???>))) ; with the current element in the list
함수 목록에 요소가 없는 경우를 처리하려면 항등 함수가 필요합니다.정의하는 것은 매우 간단합니다. 매개변수로 전달된 것과 동일한 값을 반환하기만 하면 됩니다.
또한 compose-multi
반환합니다 기능, 목록의 모든 함수를 구성한 결과 - compose
이 작업을 수행하지만 사용이 허용되지 않는 경우 다음 사항을 기억하세요.
(compose x y)
...이는 다음과 같습니다:
(lambda (n) (x (y n)))
다른 팁
이것을 두 개의 함수로 작성하는 것이 더 쉬울 수도 있습니다.하나는 함수 목록과 단일 입력을 가져와 목록의 모든 함수를 순차적으로 적용합니다.한 함수 애플리케이션의 출력은 다음 함수 애플리케이션의 입력이 됩니다.기능이 부족해지면 작업이 완료됩니다.
다른 함수는 단순히 입력 목록 전체에 걸쳐 이 도우미 함수를 매핑합니다.
정의하는 다른 방법은 다음과 같습니다. multi-map
구성 대신에 다음과 같은 작업을 사용합니다. fold
.소개 기능만 사용하도록 허용되었으므로 이는 실제로 귀하의 과제에 대한 답변이 아닙니다.하지만 당신이 자신만의 정의를 쓴다면 그렇게 될 것입니다. fold
(그리 길지 않아요!)
(define (multi-map operations input)
(fold map input operations))
> (multi-map (list 1+ square)
'(4 10 8))
$2 = (25 121 81)
> (multi-map (list 1+ square 1+)
'(4 10 8))
$3 = (26 122 82)
따뜻해지려면 더 간단한 문제부터 시작하세요.그런 다음 솔루션을 일반화하십시오.
이 함수를 어떻게 작성하시겠습니까?
(define (map-single fs x)
...)
> (map-single (list double add1) 3)
7
목록이 필요합니다. fs
, 인수 및 숫자로서의 함수 값, x
, 그리고 함수의 (구성)을 적용한 값을 계산했습니다. fs
에게 x
?