首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Haskell中使用fromPtr正确地构造加速数组?

如何在Haskell中使用fromPtr正确地构造加速数组?
EN

Stack Overflow用户
提问于 2014-02-24 02:12:38
回答 1查看 260关注 0票数 2

我正在尝试使用fromPtr从OpenCV中获取图像,并将其放入加速数组。这个特性的文档是钝的,而且这个例子不会编译(我不能安装加速-因为标准的例子)。此代码:

代码语言:javascript
运行
复制
import Foreign.Ptr
import Foreign.C.Types

import AI.CV.CxCore
import AI.CV.HighGui

import Data.Array.Accelerate as A
import Data.Array.Accelerate.IO as A
import Data.Word

main :: IO ()
main = do
  capture <- cvCreateCameraCapture 0
  frame <- cvQueryFrame capture
  imgPtr <- cvGetImage frame -- Ptr IplImage -> Ptr Word
  arr <- A.fromPtr (Z :. 480 :. 640) ((), castPtr imgPtr)
  return ()

Couldn't match expected type 'BlockPtrs (EltRepr e0)' with actual type '((), Ptr b0)'. The type variables 'e0', 'b0' are ambiguous.的结果

删除castPtr给了我Couldn't match expected type 'BlockPtrs (EltRepr e0)' with actual type '((), Ptr Word8)'. The type variable 'e0' is ambiguous.

查看BlockPtrsEltRepr的定义只会让我更加困惑。但是,将类型签名添加到表达式中,就像在(((), imgPtr) :: BlockPtrs ((), Word8))中一样,它提供了一个预期的BlockPtrs (EltRepr e0)类型和一个实际的BlockPtrs ((), Word8)类型。

这里有人有fromPtr的经验吗?

编辑:越来越近了。我以前尝试过使用构造函数EltRepr,但我并没有想到导入它的起始模块。哦哦!但是,现在我已经这样做了,用:: BlockPtrs (EltRepr Word8)替换了类型签名

代码语言:javascript
运行
复制
Couldn't match type `BlockPtrs (EltRepr e0)' with `((), Ptr Word8)'
The type variable `e0' is ambiguous
Possible fix: add a type signature that fixes these type variable(s)
Expected type: BlockPtrs (EltRepr e0)
  Actual type: BlockPtrs (EltRepr Word8)

编辑:由里德巴顿回答。它现在为我编译了,谢谢!“最终”代码:

代码语言:javascript
运行
复制
import AI.CV.CxCore
import AI.CV.HighGui

import Data.Array.Accelerate as A
import Data.Array.Accelerate.IO as A
import Data.Array.Accelerate.Array.Sugar (EltRepr)

main :: IO ()
main = do
  capture <- cvCreateCameraCapture 0
  frame <- cvQueryFrame capture
  imgPtr <- cvGetImage frame
  (arr :: Array (Z :. Int :. Int :. Int) Word8) <- A.fromPtr
      (Z :. 480 :. 640 :. 3)
      (((), imgPtr) :: BlockPtrs (EltRepr Word8))
  return ()
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-24 21:52:25

代码语言:javascript
运行
复制
fromPtr :: (Shape sh, Elt e) => sh -> BlockPtrs (EltRepr e) -> IO (Array sh e)

GHC需要知道要使用e的哪个类型来提供Elt e实例。

显然,EltRepr是一个类型家族/关联类型,因此EltRepr e不确定e。(没有理由不能有两种类型的e1e2,对于这两种类型,EltRepr e1EltRepr e2是相同的。)因此,GHC永远不能从fromPtr的参数类型中得出要使用的e类型。

Array是一个普通的类型构造函数,所以Array sh e确实决定了e。因此,您应该将类型归属放在arr上。

代码语言:javascript
运行
复制
  (arr :: Array (Z :. Int :. Int) Word8) <- A.fromPtr (Z :. 480 :. 640) ((), castPtr imgPtr)

(这将需要一些扩展,GHC将告诉您有关的情况。)或者,如果您实际使用arr的方式确定其元素的类型为Word8,则不需要这种类型归属。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21977729

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档