【发布时间】:2012-04-14 16:39:15
【问题描述】:
我是 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
}
现在,我查看了 haskell 中可能用作 std::vector 的各种容器:有列表、未装箱的向量、装箱的向量,以及一些奇怪的外来指针用法,如下所示:
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 政策是否允许通过编辑(不是次要)审查问题?它确实说“始终尊重原作者。”)
【问题讨论】:
-
n.b.编辑从问题中删除不必要的粗鲁是系统的意图,是的。 StackOverflow 是人们提出和回答编程问题的地方,它不是爆发脾气暴躁的争论的地方。
-
粗鲁?怎么这么粗鲁?这正是为什么我不必要地重写了在这个问题之前发布的问题。
-
ehird,你拿出的比我投入的要多(语气是事实),但好吧,我被否决了。
标签: haskell