我目前正在與Haskell綁定到HDF5 C庫。像許多C庫一樣,這個庫在其函數調用中使用了許多指針。管理深度嵌套支架模式的好Haskell約定是什麼?
通常的「最佳實踐」爲Haskell的分配和釋放C資金的功能按照bracket pattern,像alloca
,withArray
等。在使用它們時,我經常進入幾個嵌套的括號內。例如,這裏是一個小的摘錄爲HDF5綁定:
selectHyperslab rID dName = withDataset rID dName $ \dID -> do
v <- withDataspace 10 $ \dstDS -> do
srcDS <- c'H5Dget_space dID
dat <- alloca3 (0, 1, 10) $ \(start, stride, count) -> do
err <- c'H5Sselect_hyperslab srcDS c'H5S_SELECT_SET start stride count nullPtr
-- do some work ...
return value
alloca3 (a, b, c) action =
alloca $ \aP -> do
poke aP a
alloca $ \bP -> do
poke bP b
alloca $ \cP -> do
poke cP c
action (aP, bP, cP)
在上面的代碼中,嵌套括號托架功能我寫withDataset
,withDataspace
和alloca3
,其中我寫,以防止支架從去另一個嵌套代碼深3級。對於具有大量資源獲取調用和指針參數的C庫,使用標準支架基元進行編碼會變得難以管理(這就是爲什麼我編寫了alloca3
以減少嵌套。)
因此,一般來說,是否有任何最佳實踐或編碼技術在需要分配和釋放許多資源(如使用C調用)時幫助減少括號的嵌套?我找到的唯一選擇是ResourceT變壓器,它在教程中看起來像是設計用於使交錯資源獲取/釋放成爲可能,而不是簡化托架模式。
它似乎並不像任何allocs互相依賴,所以先寫下所有的分配,使用相同的縮進級別,然後是其他的函數。根據長度的不同,你甚至可以將它們寫在同一行上:'alloca $ \ a - > alloca $ \ b - > alloca $ \ c - > do \ n ...' – user2407038 2014-10-18 04:17:47
.reddit.com/r/haskell/comments/s49kk/using_contt_to_please_the_eye /會談很多關於成語的事情。 – Carl 2014-10-18 04:58:28
這也看起來像'alloca'的另一個monad級別。 – 2014-10-18 08:47:59