簡體   English   中英

一種具有兩種結構的數據:功能編程與命令編程

[英]One data with two structures: Functional Programming vs Imperative Programming

假設在C中,我們有以下結構:

struct MyData {
    char key1[20];
    long key2;
    ...  /* some data */
};

基本上,除了一些數據,我們有兩個鍵:key1和key2。 假設我們需要以兩種不同的方式管理MyData的一堆對象,例如,基於key1或key2(但不是兩者)快速查找相應的對象。 滿足此要求的一種方法是分別根據這兩個密鑰構建兩個不同的RB樹(或散列表)。 在C / C ++中,數據不需要重復,因為我們只需要記錄對象的指針。

在上面的假設示例中,關鍵點在於我們有一堆相同類型的數據,我們可以通過兩種不同的數據結構組織它,而不用命令式語言復制數據。 我想知道純函數式編程如何在不重復數據的情況下有效地滿足這一要求。 為了使其更具普遍性或挑戰性,兩種數據結構可能不是同一類型。 例如,一個可以是rb-tree而另一個可以是hash-table。

如果可能,請在Haskell中布局您的解決方案。

PS:作為函數式編程的新手,我不禁想知道如何在純函數式編程中從命令式編程中獲得一些技巧。 我知道有時根本沒有意義。 如果有人覺得這個問題也沒有意義,請詳細說明。

謝謝

這通常也不是函數式編程中的問題。

data MyData = MyData
  { key1 :: ByteString
  , key2 :: Int
  , {- some data -} }

現在我們可以構建一個HashMap ByteString MyData ,使用key1作為鍵,或者使用key2作為索引的Vector MyData ,或者其他什么。 只有指向鍵的指針才會重復,而不是記錄甚至鍵本身。

Haskell或任何其他語言(命令性或功能性)沒有理由默認情況下不存儲對不可變對象(尤其是那些大於指針的對象)的引用/指針,除了特殊的優化原因,例如內存布局或功能代碼由例如引擎蓋下的編譯器重寫以提高性能。

換句話說,沒有理由不假設Haskell(或任何其他現代語言)按預期處理這個並且像C一樣有效。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM