Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell异构可存储对象列表_Haskell_Polymorphism_Existential Type_Heterogeneous - Fatal编程技术网

Haskell异构可存储对象列表

Haskell异构可存储对象列表,haskell,polymorphism,existential-type,heterogeneous,Haskell,Polymorphism,Existential Type,Heterogeneous,我想写一个函数,它可以创建一个可存储对象(不同类型)的异构列表 但我得到编译错误: No instance for (Storable a1) arising from a use of `sizeOf' The type variable `a1' is ambiguous Note: there are several potential instances: instance Storable CChar -- Defined in `Foreign.C.Types' instan

我想写一个函数,它可以创建一个可存储对象(不同类型)的异构列表

但我得到编译错误:

No instance for (Storable a1) arising from a use of `sizeOf'
The type variable `a1' is ambiguous
Note: there are several potential instances:
  instance Storable CChar -- Defined in `Foreign.C.Types'
  instance Storable CClock -- Defined in `Foreign.C.Types'
  instance Storable CDouble -- Defined in `Foreign.C.Types'

Couldn't match expected type `a2' with actual type `Int'
  `a2' is a rigid type variable bound by
       a type expected by the context: Storable a2 => a2
和其他人

然后我创建一些数据类型

{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE RankNTypes, ExistentialQuantification, ImpredicativeTypes #-}

data AnyStorable = forall a. Storable a => AnyStorable a

pokeMany :: Ptr b -> Int -> [AnyStorable] -> IO ()
pokeMany _ _ [] = return ()
pokeMany ptr offset (AnyStorable x:xs) = do
    pokeByteOff ptr offset x
    pokeMany ptr (offset + sizeOf x) xs

somePoke :: Ptr a -> Int -> Int -> IO ()
somePoke ptr n c = pokeMany ptr 0 [AnyStorable n, AnyStorable c, AnyStorable 'a']
上面的代码没有任何编译错误


我可以编写
pokeMany
函数而不创建像AnyStorable这样的新数据类型吗?

简言之,否。您需要的是
存在
关键字来指定将映射到集合上的函数的签名。在数据类型中使用
forall
可以有效地从另一端表达相同的内容


BTW,您可以考虑制作<代码>可存储的< /C> >代码>可存储的< /代码> .< /P>当然,您是对的。code>AnyStorable必须是

Storable
的实例。
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE RankNTypes, ExistentialQuantification, ImpredicativeTypes #-}

data AnyStorable = forall a. Storable a => AnyStorable a

pokeMany :: Ptr b -> Int -> [AnyStorable] -> IO ()
pokeMany _ _ [] = return ()
pokeMany ptr offset (AnyStorable x:xs) = do
    pokeByteOff ptr offset x
    pokeMany ptr (offset + sizeOf x) xs

somePoke :: Ptr a -> Int -> Int -> IO ()
somePoke ptr n c = pokeMany ptr 0 [AnyStorable n, AnyStorable c, AnyStorable 'a']