函數語言程式設計學習-SICP-LISP-流STREAM的實現-流程式設計思路和惰性/延時求值2

KillJUMP發表於2020-10-19

如何與時間解耦

流式程式

看待流的方法:即一下子處理了整個流。

在這裡插入圖片描述

準備例子:

第一個例子:將兩個流相加。
在這裡插入圖片描述

第二個例子:運用到流上的所有專案

在這裡插入圖片描述

一個由1組成的無盡列表

(define ones (cons-stream 1 ones))

如何定義整數:
在這裡插入圖片描述

定義斐波那契數列
在這裡插入圖片描述

何做到不要顯式定義很多delay?
讓整個底層都延時。讓delay自動內建在語言之中。

這種語言叫做“正則序求值”(normal order)語言。而我們一直用的語言叫做application-order語言。即先求引數,再求值。而前者把整個引數放到函式中。

如果這樣做了,cons也會自動變成cons-stream。有人這樣做了。

但是,如果我們放棄了對時間的控制,雖然程式碼優雅,但是表達力下降。

比如,迭代函式會一直迭代下去。這是一個缺點。

正則序和副作用直接不能良好配合。不能建模具有區域性狀態的變數,又用正則序的方法解耦時間。
(據說haskell中的monad可以解決這個問題?)

比如:

在正則序的環境裡:
在這裡插入圖片描述
在這裡插入圖片描述
如何處理這個問題?——放棄區域性狀態這件事

函數語言程式設計。

相關文章