2016-12-31 54 views
4

如何从Haskell的inline-c的C块中获取一个列表或数组?换句话说,如何在C中构建复杂数据并在Haskell中使用它。 事情是这样的:如何从Haskell的inline-c中的C块返回一个列表或数组?

foo :: IO [Int] 
foo = do 
what? <- [C.block| <what?> { 
    ints = calloc(10, sizeof(int)); 
    // ... 
    return <what?>; 
    } |] 
    return <what?> 

我可以换一个指针和一些Haskell的类型大小,但我想用在Haskell名单的工作,打印,编码在JSON等

回答

3

从您的C代码返回一个指向数组的指针,并使用peekArray将其编组到列表中。

import Foreign.Marshal.Array 
import Language.C.Inline 

foo :: Int -> IO [Int] 
foo size = [exp| int* { calloc($(int size), sizeof(int)) }] >>= peekArray size 

peekArray接受一个指针参数和一些要读取的元素。它迭代地递增指针size次,使用类型的Storable实例(在本例中为Int)从阵列中提取元素。

turn your array into an unboxed Vector的效率可能更高。

+0

假设数据被复制并分配内存可以被释放是否安全? – Igor

+1

@Igor用'peekArray',是的。用'unsafeFromForeignPtr',no。 –

+1

@Igor PS,[Haskell绑定到'malloc'和朋友已经存在](https://hackage.haskell.org/package/base-4.9.0.0/docs/Foreign-Marshal-Array.html#v:callocArray) 。 –

相关问题