2016-10-19 42 views
0

原諒我的新手,因爲我是新來的FP。一直在與Elixir合作,所以我標記了它。FP中的類型與OOP中的對象有何根本的不同?

當我使用Elixir的iex時,我可以使用i檢查變量的類型。例如i "hello"顯示我我可以使用String模塊的功能。我可以做String.downcase "HELLO",這看起來好像是發送一個消息給一個返回另一個對象的對象,但是用一種不同的方式表現爲一個數學函數。 i幫手也好像檢查一個對象的類,然後幫助我找出該對象中可用的所有方法。

我知道不變性是函數式編程的一個關鍵特性。我可以很容易地用許多面向對象的語言做不變性,但是程序員有責任。

我一直在閱讀Elixir的書籍和博客,這些書籍和博客建議我忘記我的面向對象的思維方式,從根本上思考問題。當我唯一的區別是不可變時,我只是不明白它們有什麼根本性的差異,需要改變思維方式。

+0

類型正交於FP的原則(不變性,參考透明度等)。有功能動態類型的語言,如clojure和erlang。部分你的困惑是,一些靜態類型的OO語言*咳嗽Java * *咳嗽超載類的想法來表示命名空間,用戶定義類型等。 –

回答

1

我認爲你的問題可能會更精確地指定爲

「是什麼類和代數數據類型之間的區別?」

這聽起來像你知道一個對象,一類是什麼,所以你可以通過ADT的閱讀起來完成拼圖:

https://en.wikipedia.org/wiki/Algebraic_data_type

另一個關鍵是理解抽象數據類型和類之間的區別是類處理數據和方法的封裝,而ADT通常僅限於數據。但是,請注意,現代趨勢是混合2,參見例如斯卡拉的案例類。

+0

我想我把類型和編程範例的概念分組到當Jared指出的概念比較時,它是相同的桶。改寫這個問題會有所幫助,而且我已經取得了一些進展,但我仍然在努力弄清楚他們的真正含義。 –

1

i助手函數不會「檢查對象的類別」,它基本上是一個對Elixir中的核心術語類型進行操作的協議。 Elixir中的每個數據值都是這些類型中的一個或它們的組合。

[Atom, Integer, Float, BitString, Regexp, PID, Function, Reference, Port, Tuple, List, Map] 

i命令做了一些額外的檢查這些類型是標準庫的一部分,例如結構體和與所述的erlang char_list問題幫助的變化之間進行區分。它遠遠不能達到 ;如果你使用複雜的組合類型,它所知道的所有 是組合的最高級別。

如果僅限於這些基礎知識和標準庫,與OO的區別並不明顯。但是,如果您真的需要離開面向對象思想,那麼當您開始編寫特定於您的代碼的數據結構時。

在Elixir中,子類或子類模塊沒有辦法[1]。沒有猴子修補;沒有辦法給String添加新的函數。儘管你可以使用Modules和Structs來複制單個對象並編寫乍看起來看起來OO的代碼,但是一旦你跨越某種程度的複雜性,這種思維方式就會崩潰。

面向對象思維的箴言所針對的是你的代碼的更大體系結構。當你問這些問題時,Elixir是最簡單的:

我的數據結構是什麼?

我需要對這些數據結構進行哪些轉換?

如果您開始思考OO方式,您會遇到麻煩。

我的名詞是什麼?

對於每個名詞,我的動詞是什麼?

雖然這些問題乍一看似乎相似,但功能並不是數據本身的區別。您可以將任何模塊的任何功能應用於您的數據。數據和功能的解耦是關鍵的區別。

[1] - Elixir非常靈活,您可以在其中實施某種OO系統。

+0

它開始與其他答案結合起來,這是最有幫助的。我需要更多的經驗才能直觀地瞭解差異。任何關於具有清潔FP設計的Elixir開源項目的建議都會有所幫助。 –

相關問題