2016-11-12 4 views
1

私は初心者です。私は基本関数foldl/foldrを理解しようとしています。私はdocumentationを読んでいくつか試しました。 しかし、私はこのケースでは、その動作を把握することはできません:関数が原始的であるので、私はfoldlのトレースすることはできませんラケットのプリミティブ「foldl」を理解する

(expt (expt (expt (expt 2 1) 2) 3) 4) 
>> 16777216 

(foldl expt 2 '(1 2 3 4)) 
>> 262144 

私は結果は同じであるべきだと思います。私はこの手順がどのようにこの結果を達成するのか分かりません。私はラケットとラケット博士を使用しています。

+0

この投稿は役に立ちました:http://stackoverflow.com/questions/39018163/expanded-form-of-fold-in-racket – rnso

答えて

3

foldlの理解には逆順の引数があります(fold/reduceの引数の順番はvary somewhat arbitrarily between languagesになるため、理解できます)。次のように正しい等価である:脇の小さなとして

> (foldl expt 2 '(1 2 3 4)) 
262144 
> (expt 4 (expt 3 (expt 2 (expt 1 2)))) 
262144 

foldlはビルトイン#lang racket/baseであるが、それはそれは、実行時に実装されているという意味でプリミティブではありません。 DrRacketを使用している場合は、foldlを右クリックし、 "Open Defining File"を選択すると、実装されているモジュール(この場合はracket/private/list)が開きます。

関連する問題