2013-10-12 3 views
0
(define-struct position (name numshares share-price)) 

(define p1 
(cons (make-position "INT" 10 192) (cons (make-position "SSS" 4 42) 
empty))) 

mult체계 구조 및 목록

(define (mult n) 
    (* (position-numshares n) 
    (position-share-price n))) 

CONST이 위치 numshares 및 목록의 위치 주가 소요 둘을 곱한 내 도우미 함수입니다.

(define (const n) 
    (cond 
    [(empty? n) empty] 

    [(cons? n) 
     (+ (mult (first n)) 
       )])) 

내가하고 싶은 것은 목록의 첫 번째 부분을 취해 나머지 목록을 함께 추가하는 것입니다. 대신, 나는 단지 목록의 첫 번째를 얻는다. 그래서 내가한다면 (const p1) 1920 년에야 얻을 수 있지만 2088 (10 * 192 + 4 * 42)을 얻고 싶습니다. 나머지는 반복적으로 시도했지만 오류가 발생합니다. 아마 뭔가 간단한 것이 빠져 있습니다. 도움을 주시면 감사하겠습니다.

답변

2

첫째, 당신은 그래서 당신은

(define p1 
    (list (make-position "INT" 10 192) 
     (make-position "SSS" 4 42))) 
읽기 쉽게

및 차종에 p1을 정의

(list a b) 

대신

(cons a (cons b empty)) 

의 할 수있는, 일반적으로 점에 유의 너의 의도가 더 분명해. 이제 (make-position "INT" 10 192)으로 생성 된 구조에서 1920을 얻으려면 도우미 절차 mult을 정의했습니다. 목록의 p1mapmult을 입력하면 (1920 168)의 새 제품 목록을 얻을 수 있습니다. 그런 다음 해당 목록에 foldl+0을 사용하여 합계를 계산할 수 있습니다. 당신이 (map 새로운 목록이 할당지고 있다는 것을 의미하기 때문에, 합리적인 수 있습니다) foldmap를 사용하지 않을 경우

(define (const lst) 
    (foldl + 0 (map mult lst))) 

(const p1) 
;=> 2088 

수동이를 작성할 수 있습니다

(define (const lst) 
    (let const ((sum 0) (lst lst)) ; pretty much an implementation of fold, but 
    (if (null? lst)    ; with the function + built in, and mult applied 
     sum      ; to each element before passing to + 
     (const (+ sum (mult (car lst))) 
       (cdr lst))))) 

(const p1) 
;=> 2088 

또 다른 대안은 foldl을 사용하는 것이지만 +mult을 결합하는 함수로 전달하십시오.

(define (const3 lst) 
    (foldl (lambda (struct sum) 
      (+ (mult struct) sum)) 
     0 
     lst)) 

(const3 p1) 

Common Lisper로서, Scheme의 foldl 프로시 저는 함수가 적용되기 전에 목록의 각 요소에 적용되는 키 인수를 사용하지 않는다는 사실에 조금 실망 스럽습니다.

(reduce '+ p1 :key 'mult) 
+0

@Josh이 주름에 대한 자세한 내용은, 당신은 (HTTP를 [목록을 병합에 대한이 답변]에서보고가있을 수 있습니다 : 커먼 리스프에서 우리는 (foldl/foldr는 커먼 리스프에 reduce입니다) 써서 : //stackoverflow.com/a/19229532/1281433) 및 [이 값에 대한 답변] (http://stackoverflow.com/a/19006055/1281433)을 참조하십시오. (면책 조항 : 둘 다 내 대답입니다.) –