2015-10-06 67 views
0

我如何用2個參數(foldl-1 proc xs)寫一個摺疊式左功能?這是行不通的:如何用2個arg創建摺疊?

(define (my-fold-left op xs) 
    (define (func proc start xs) 
    (let ((start xs)) 
     (set! start (car xs)) 
     (if (null? xs) start 
      (func op (op start (car xs)) (cdr xs)))))) 

回答

1

您的代碼沒有意義...爲什麼在這裏使用set!?結果的初始值是多少?爲什麼定義功能func如果你不打請致電呢?要實現一個典型的3 ARG fold-left嘗試這樣的事情,注意到,的fold-left的主要優點是,它的尾遞歸,我們用一個參數積累的結果:

(define (fold-left op ini xs) 
    (let loop ((acc ini) (lst xs)) 
    (if (null? lst) 
     acc 
     (loop (op (car lst) acc) (cdr lst))))) 

如果你真的需要一個2-arg版本的fold-left,請刪除ini參數,並在第二行開始時爲acc設置默認值。請注意,通過這樣做,您將限制此過程的實用性,只返回固定類型的結果,具體取決於您選擇的初始值。

+0

不是函數參數的合理初始值可能是列表的第一個元素(如果它不是空列表)。 –

+0

@JoshuaTaylor是的,這似乎是OP想要做的事情:'(set!start(car xs))',但我會讓他做出決定。 –

+2

這是Common Lisp的[reduce](http://www.lispworks.com/documentation/HyperSpec/Body/f_reduce.htm)在沒有提供初始值時的行爲。 –