2012-04-14 85 views
1

我是新來的haskell,所以我試圖在haskell中重新創建以下C++代碼。我應該使用哪個容器?

int main() { 
    class MyClass { 
     public: 
     int a; 
     std::string s; 
     float f; 
    }; 
    std::vector <MyClass> v; 
    LoadSerialized(&v); // don't need haskell equivalent; just reads a bunch of MyClass's and pushes them back onto v 
} 

現在,我已經看了哈斯克爾各種容器可能工作爲的std ::向量的位置:有名單,未裝箱向量,向量盒裝,以及外國指針像下面這樣的一些奇怪的用法:現在

data Table = Table { floats :: ForeignPtr CFloat 
        , ints :: ForeignPtr Int } 

newTable :: IO Table 
newTable = do 
    fp <- S.mallocByteString (floatSize * sizeOf (undefined :: CFloat)) 
    ip <- S.mallocByteString (intSize * sizeOf (undefined :: Int )) 
    withForeignPtr fp $ \p -> 
     forM_ [0..floatSize-1] $ \n -> 
      pokeElemOff p n pi 
    withForeignPtr ip $ \p -> 
     forM_ [0..intSize-1] $ \n -> 
      pokeElemOff p n n 
    return (Table fp ip) 

,我可以實現在我的思維方式的C++代碼是最好的 - 是一個Haskell新手。或者我可以讓那些對語言更有經驗的人問最好的方式是什麼,因爲對我來說,看起來有一些細微差別在我這裏發生,我錯過了。簡單地說,我想將包含許多數據類型的結構推送到haskell容器中,而我不關心順序。如果有幫助,我將讀取序列化數據到容器中,您可以看到LoadSerialized

我不是在C++代碼混合。

(編輯:是的StackOverflow政策,允許通過編輯問題的審查(不小的),它說:「永遠尊重原作者」)

+4

n.b.是的,系統的意圖在於編輯們刪除了不必要的粗魯。 StackOverflow是人們提出和回答編程問題的地方,它不是一個暴露不好的理由的地方。 – dave4420 2012-04-14 17:25:28

+0

粗魯嗎?那是多麼粗魯?這就是爲什麼我不必要地重寫在此之前發佈的問題。 – joshj 2012-04-14 17:27:07

+0

ehird,你比我付出更多的東西(語氣本來就是事實),但我被推翻了。 – joshj 2012-04-14 18:07:54

回答

3

如果您在Haskell編寫整個程序,除非你有充分的理由不要使用列表。 (如果你有充分的理由不這樣做,請說出它是什麼,我們可以幫助你選擇一個更合適的數據結構,例如隨機訪問一個特定的列表元素是O(n)而不是O(1)的一個C++向量,並且在Haskell中更新數據結構中的值是不同的。)

如果您在同一個程序中混合使用Haskell和C++,並且您需要幫助從Haskell調用C++,請說。

  • 默認使用列表。列表操作(如mapfoldrfilter)可以通過編譯器融合在一起,從而產生比通常使用C++向量更高效的代碼。
  • 如果您發現自己需要按索引查找元素,或者想要在特定索引處對元素進行變異,請使用某種數組。見Data.Array,Data.Array.IOData.Array.ST
  • 如果您發現自己需要在數據結構中間或結構的兩端插入新元素,請使用序列。見Data.Sequence
+0

在C++中不混合。我認爲列表的原因可能是一個壞主意,這裏顯然存在性能問題。此外,我認爲可能與C++並行,因爲你只是不會使用某些容器來解決某些問題:例如,std :: list應該很少用來代替std :: vector,即使它可以工作。顯然,haskell中的haskell向量容器比list更適合這個問題?但爲什麼推薦他們? – joshj 2012-04-14 16:56:57

+0

甚至沒有聽說過Data.Array或Sequence。希望那裏有一個所有haskell數據結構的複雜表。最後一件事,我應該如何使用Data.Vector?我認爲只有在混合C++代碼時才應該使用外部指針方法? – joshj 2012-04-14 17:26:06

+0

是的,我在回覆你的編輯時寫道。 Data.Vector的用途是什麼,混合C++代碼時只能使用外部指針方法是否正確? (此信息需要添加到haskell wiki) – joshj 2012-04-14 17:30:09