2012-04-14 81 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