iT邦幫忙

0

SICP lec6a : 流 I part1 (map, accu, filter)

  • 分享至 

  • xImage
  •  

此篇為 SICP教程 6a 的筆記

接續前面說到的 賦值 是因為要建立模塊,對應真實世界的物件,但卻造成了很多問題,那如何不管每個物件在"時序"上的狀態,又可以串連每一個物件來處理數據呢?

以之前的數位電路模擬器為例,其實不用去考慮每一個時間點下物件的狀態,更宏觀的看,把input的信號看成橫軸為時間、縱軸為大小的"波形訊號",如下圖
https://ithelp.ithome.com.tw/upload/images/20190513/20117516OEBaaTiVYX.png
每一個時間下的信號(黑色點),可以直接看成一段波形信號(藍色線)

把整體看成是一個濾波器,input是一個"波形"、output是另一個"波形",而不是在一個時間點內互相影響的小物件。

來演示一下吧

範例說明

  1. 給定一個2元樹如下圖,找出 節點中所有奇數的平方和
    https://ithelp.ithome.com.tw/upload/images/20190513/20117516AHame4BAsP.png
    https://ithelp.ithome.com.tw/upload/images/20190513/20117516scaQwfnkXq.png
  2. 對於每個整數K,求出K個 Fabonacci number,且挑出其中的奇數組成一個list
    https://ithelp.ithome.com.tw/upload/images/20190513/20117516gYPKrzOgEb.png
    這兩個範例,看似是做不一樣的計算,但卻有些相似之處,如果我是一個訊號處理工程師,會如何思考這兩個問題
  3. https://ithelp.ithome.com.tw/upload/images/20190513/201175160so7yUyC5K.png
  4. https://ithelp.ithome.com.tw/upload/images/20190513/2011751696MLFep22F.png
    有沒有非常的像呀,這就是map, accu, filter,在非訊號處理觀點的部分,map, accu, filter其實都有用到,只不過分散在各個部分,導致完全看不出來。

而為什麼可以用map, accu, filter來操作呢,最大的關鍵是所處理的信號數據結構,稱為"流 streams",在clojure稱為 "宏 macro"。

流 streams

是一種數據抽象,向其他數據抽象一樣,可由構造函數與選擇函數來描述。

  • 構造函數: (cons-stream x y)
  • 選擇函數: (Head s)取stream的第一個數 (Tail s)取第一個後的所有數
  • empty-stream:空的stream
For Any x, y
(Head (con-stream x y)) -> x
(Tail (con-stream x y)) -> y

Map
https://ithelp.ithome.com.tw/upload/images/20190513/20117516fXToIJ4D9D.png
Filter
https://ithelp.ithome.com.tw/upload/images/20190513/20117516bryirrJyru.png
Reduce
https://ithelp.ithome.com.tw/upload/images/20190513/20117516OnTkgaZWv8.png

使用了 map, accu, filter後

  1. https://ithelp.ithome.com.tw/upload/images/20190513/20117516Yy2qEqUGfD.png
  2. https://ithelp.ithome.com.tw/upload/images/20190513/20117516S6F8UMUFs5.png

變成Streams的處理之後,可以看到處理的過程一目瞭然,而且可以根據需求快速的變動,由於建立了一個"約定的接口"有streams, map, accu, filter這些基本元件,讓我們可以任意組合製造程序。


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言