
無為的程式設計
|
181
數值運算
現在我們有數值、布林值、條件式、述語、對組,幾乎已經準備好重新實作模數運算子
了。
但在開始之前,我們需要能執行更簡單的運算,諸如遞增和遞減單一數值。遞增相當直
覺易懂:
INCREMENT = -> n { -> p { -> x { p[n[p][x]] } } }
讓我們來看看
INCREMENT
的運作方式:我們使用以 proc 為基礎的數值
n
來呼叫它,它會
傳回新的 proc,這個新的 proc 需要一些其他的 proc
p
和一些任意的第 2 個引數
x
,就
如同數值一般。
當我們呼叫這個新的 proc 的時候,它會做什麼?首先,它會以
p
和
x
呼叫
n
(因為
n
是
數值,也就是『在 x 呼叫
p
、
n
次』,就像原始數值所完成的),然後在此結果再次呼叫
p
一次。大致而言,會在這個 proc 的第 2 個引數呼叫第 1 個引數
n + 1
次,也就是如何
正確表示數值
n + 1
。
但是遞減要怎麼做呢?這看似是更難的問題:只要已經呼叫
n
次 proc,就很容易新增
額外的呼叫,因此這雖然會呼叫
n + 1
次,但並沒有明顯的作法可『還原』它們其中一
個,而變成
n - 1
次呼叫。
其中一個解決方案是設計 proc,在某些初始引數呼叫了
n
次時,傳回數值
n - 1
。所幸
對組提供了完成這項工作的正確方式。想想這個 Ruby 方法做了什麼:
def slide(pair)
[pair.last, pair.last + 1]
end
當我們以雙元素陣列的數值呼叫
slide
時,它會傳回新的雙元素陣列,元素裡包含第 ...