我試圖在Scheme中找到多個參數「compose」的「最佳」實現(我知道這是在某些實現中的內建,但假設我現在是使用一個沒有這個的)。Scheme:使用fold實現n參數
對於2參數構建功能我有這樣的:
(define compose
(lambda (f g)
(lambda x
(f (apply g x)))))
這樣做的好處是,如果最右側的功能需要額外的參數,這些仍然可以通過組合功能通過。這具有令人滿意的特性,即在某物上組合身份功能不會改變該功能。
例如:
(define identity
(lambda (x) x))
(define list1
(compose identity list))
(define list2
(compose identity list1))
(list2 1 2 3)
> (1 2 3)
現在做一個「正論證」撰寫我可以這樣做:
(define compose-n
(lambda args
(foldr compose identity args)))
((compose-n car cdr cdr) '(1 2 3))
> 3
但這不再保留那該多好「身份」屬性:
((compose-n identity list) 1 2 3)
> procedure identity: expects 1 argument, given 3: 1 2 3
問題是用於foldr命令的「初始」函數。它已內置:
(compose identity (compose list identity))
所以......我不確定最好的解決方法。 「與foldl」似乎是天然的更好的選擇,因爲我想將它與「身份」開始對左不是權 ...
但天真的實現:
(define compose-n
(lambda args
(foldl compose identity args)))
其中工程(必須扭轉的功能應用程序的順序):
((compose-n cdr cdr car) '(1 2 3))
> 3
因爲現在我最終把身份功能左側沒有解決不了的問題!這就像,我需要使用「foldr」,但需要一些不同的「初始」值比身份函數...或更好的身份函數?顯然我很困惑!
我想實現它無需編寫明確的尾遞歸「循環」 ...這似乎應該有一個優雅的方式來做到這一點,我只是卡住了。
[德克的答案](http://stackoverflow.com/questions/1693181/scheme-implementing-n-argument-compose-using-fold/1693202#1693202)(因爲刪除)有正確的想法:只需使用'values'而不是'identity'。這實際上是我的'compose'實現的方法:'(compose)'簡單地返回'values'。 – 2009-11-09 00:02:50
謝謝!我現在唯一的問題是,我正在使用doens't支持call-with-values的方案解釋器......有沒有一種方法可以在現有計劃的基礎上實施「價值觀」和「呼叫價值」? – 2009-11-09 13:08:30
我開發了一種方法來排序虛假的'價值'和'調用價值':新帖子出現了。 :-) – 2009-11-10 23:39:09