Jos*_*tor 7 haskell kdtree algebraic-data-types higher-kinded-types
我试图制作一些Haskell类型,这些类型不是由类型参数化,而是由类型的元素,特别是整数.例如,R ^ 2中的(线性代数)矢量和R ^ 3中的矢量是不同类型的对象.具体来说,我正在Haskell中编写一个KD树,我想通过一个正整数对我的数据结构进行参数化,因此三维树和四维树具有不同的类型.
我试图通过元组对我的树进行参数化,但它似乎没有去任何地方(并且似乎有点不太可能推进,特别是因为它似乎不是三元组或更大的甚至是仿函数(和我不知道怎么说,例如HomogeneousTuple a => Functor a).我想做这样的事情:
data (TupleOfDoubles a) => KDTree a b = ... ---so in a 3DTree a is (Double,Double,Double)
Run Code Online (Sandbox Code Playgroud)
这将是不错的,或类似的东西同样好
data KDTree Int a = ... -- The Int is k, so KDTree has kind Int -> * -> *
Run Code Online (Sandbox Code Playgroud)
有谁知道这些影响是否可行或合理?
谢谢 - 约瑟夫
正在进行一项名为TypeNats的GHC扩展,这正是您想要的.然而,根据票证,目前的里程碑目前设定为7.4.1 ,所以这还有点等待.
在该扩展可用之前,您唯一能做的就是使用类型对维度进行编码.例如,这些行可能有效:
{-# LANGUAGE ScopedTypeVariables #-}
class MyTypeNat a where
toInteger :: a -> Integer
data Zero
data Succ a
instance MyTypeNat Zero where
toInteger _ = 0
instance MyTypeNat a => MyTypeNat (Succ a) where
toInteger _ = toInteger (undefined :: a) + 1
data KDTree a b = -- ...
dimension :: forall a b. MyTypeNat a => KDTree a b -> Integer
dimension = toInteger (undefined :: a)
Run Code Online (Sandbox Code Playgroud)
像这样的方法的缺点当然是你必须写一些KDTree (Succ (Succ (Succ Zero))) Foo
代替的东西KDTree 3 Foo
.