當前位置:編程學習大全網 - 編程語言 - 什麽是函數式編程思維

什麽是函數式編程思維

回答都有跑題,show概念之嫌,題主問的是函數式思維,這個問題我壹直在思考,畢竟是方法論,能力有限,只能從切身實踐告訴妳

1.表達式化

最初的時候,需要轉變觀念,去可變量,去循環,把命令式改成表達式,註意,這只是把妳丟在荒山野嶺讓妳感受壹下,離開熟悉的環境,地球依然在轉,但是有個

重點,那就是壹切都是表達式; 為什麽是表達式呢?這個問題就像為什麽魚在水裏?

因為函數式建立在lambda演算之上而非圖靈機,只不過兩者被證明等價,所以妳可以在妳的機器上跑全是表達式的代碼,就如有人證明天空適合魚生存,所以

魚可以在天上遊

當妳接受了魚可以在天上遊之後,就該上正餐了

1.5 數據與行為分離

這也是和面向對象不壹致的地方,面向對象強調數據與行為綁定,但函數式不是,確切的說函數式 函數與數據等價,所以妳才可以將函數當參數與返回值,妳在設計時,切勿讓數據自己長腿能跑,其次,行為必須消除副作用,不可以偷偷把數據改了,習慣第壹條後,應該不會的

2.高階邏輯

了函數式,就不要在想循環,賦值這些低階邏輯了,而應該更高階的思考問題,這比轉化表達式更難,函數式又叫聲明式,也就是妳要做什麽,只要說壹下就行,而

非寫個遍歷,做個狀態判斷,用函數式妳不需要考慮這些,妳不知道函數式的列表是怎麽遍歷的,中間向兩邊?

從後往前?這也是為何函數式適合並發的原因之壹,妳想知道列表中大於3的數有多少,只要,list.count(_ > 3)

而不是寫循環,妳可以直接寫妳的業務,不要拘泥於細節,有點像sql, 妳需要什麽告訴電腦就行,妳或許會問,count foreach filter

這些函數怎麽來的? 因為有了他們妳才不需要寫循環,他們把妳留在高階邏輯中,這個問題的答案請看下面

3.組合子邏輯 或又叫 自底向上的設計

數式和OO是反的,面向對象是自頂向下的設計,函數式是自底向上的設計,也就是先定義最基本的操作,然後不斷組合,不斷堆積以滿足妳的所有需要,如sql

定義了select, from, where...這幾個組合子,來滿足妳的查詢需求,同理函數式語言會提供foreach,

map等組合子(操作)來滿足妳的需求,所以妳必須自下而上的設計妳的代碼結構,並且滿足妳的需求,當妳只用組合子寫代碼時,妳會發現妳寫的全是高階邏輯

果這些已有組合子滿足不了妳,妳就得自己寫,foreach不行,妳就自己寫遞歸,我告訴妳,遞歸背後也是組合子,這裏壹些'大神'應該不知道,在圖靈機

裏,遞歸就是方法不斷調用自己沒什麽好說的,但是在lambda演算中,匿名函數是沒法調用自己的,所以遞歸是用Y組合子(又叫不動點組合子)把遞歸函數

自己求解出來再調用的,這才可以實現遞歸,並與圖靈機的循環等價,有點跑題了,總之要想順手的寫函數式,最好用面向組合子的設計,註意,不是必須,組合子

演算和lambda演算可以相互轉化,也就是,妳完全可以寫壹堆雜亂的表達式,但沒有組合子邏輯來得清爽,Haskell大規模使用monad這個特殊組

合子,始其變得統壹整潔

好了,總結壹下

函數式思維,其實就是組合子邏輯,用簡單的幾個函數組合來構建復雜邏輯,始終以高階的角度去表達問題,而非依賴副作用。

知道這點,妳用java也可以寫函數式代碼了

但是,這也只是本人積累得來的感悟,絕不敢大肆伸張這就是函數式,我也在不斷研究中,如有問題,還望大神指正

  • 上一篇:我要車值徑為50的內孔長度為30用G71怎麽編程,最主要的是30這個長度怎麽
  • 下一篇:全面戰爭戰錘3野獸系法術效果與強度評測
  • copyright 2024編程學習大全網