我正在尝试使用Haskell mmap包,我对Haskell很新,所以我试着通过编写一个小程序来将少量数据写入内存映射文件.
此代码正确创建和文件大小,但似乎没有将数据从向量刷新到内存映射文件; 我使用hexdump验证了这一点 - 它只是全0.
出了什么问题?
import Control.Monad
import Data.Vector.Storable
import Foreign.Marshal.Array
import System.Directory
import System.IO
import System.IO.MMap
createFile :: FilePath -> Integer -> IO ()
createFile path size = do
h <- openBinaryFile path WriteMode
hSetFileSize h size
n = 10
size = 10 * 8
path = "test.dat" :: FilePath
main :: IO ()
main = do
createFile "signal.ml" size
let v = generate n (\i -> i) :: Vector Int
putStrLn $ show v
(ptr, s, …Run Code Online (Sandbox Code Playgroud) 我正在通过Haskell代码看看我如何编写类似的流融合函数,我注意到一个有趣的语法结构,{ - #...# - },我没有遇到过; 所以我想知道它是什么以及如何找出它是如何工作的:
-- | /O(n)/ Drop elements that do not satisfy the predicate
filter :: Vector v a => (a -> Bool) -> v a -> v a
{-# INLINE filter #-}
filter f = unstream . inplace (MStream.filter f) . stream
Run Code Online (Sandbox Code Playgroud)
更具体地说,具体线路做什么?
{-# INLINE filter #-}
Run Code Online (Sandbox Code Playgroud) 我想知道是否可以在 OCaml 中进行编译时检查以确保数组的长度正确。对于我的问题,我想在进行分段向量减法之前验证两个 GPU 1-dim 向量的长度是否相同。
let init_value = 1
let length = 10_000_000
let x = GpuVector.create length init_value and y = GpuVector.create 9 init_value in
let z = GpuVector.sub v1 v2
Run Code Online (Sandbox Code Playgroud)
在这个例子中,我希望它抛出一个编译错误,因为 x 和 y 的长度不同。由于我是 OCaml 菜鸟,我想知道如何实现这一目标?我猜我将不得不使用函子或camlp4(我以前从未使用过)
我正在学习C++,我已经编写了一些代码来获得手动创建和删除对象的一些经验.我不认为我完全理解删除的语义,因为print语句仍然打印3,我相信它不应该.
码
#include <iostream>
class Test {
public:
int x;
int y;
};
using namespace std;
int main() {
Test t1;
t1.x = 1;
t1.y = 2;
cout << t1.x << endl;
cout << t1.y <<endl;
Test *t2 = new Test();
t2->x = 3; t2->y = 4;
cout << t2->x << endl;
cout << t2->y <<endl;
delete t2;
cout << t2->x << endl;
}
Run Code Online (Sandbox Code Playgroud)
产量
joel-MacBook-Air:src joel$ ./test
1
2
3
4
3
Run Code Online (Sandbox Code Playgroud)
请问你能解释为什么它在最后打印3?我的知识是它不应该打印3删除对象.