gpt4 book ai didi

haskell - 如何在 Haskell 中建模 OLAP 超立方体

转载 作者:行者123 更新时间:2023-12-04 10:00:09 24 4
gpt4 key购买 nike

到目前为止,我的想法是:

类型

超立方体是从一个或多个维度到某个值的(离散)函数。我想为维度使用枚举类型,最终得到了这个类型类:
class (Eq a, Ord a, Show a, Enum a, Bounded a) => Dimension a
这让我可以使用它

data Age = Young | Adult | Old    deriving (Eq, Ord, Show, Enum, Bounded)
instance Dimension Age

以及与 Dimensions 类似的类型。

一个二维立方体,其中值的类型为 Double然后有类型
cube2D :: (Dimension a, Dimension b) => a -> b -> Double

运营

我可以轻松旋转立方体:
cube2D' p a = cube2D a p
我可以获得维度的所有可能值(“参数”),对于一维立方体,我也可以获得可能的结果
arguments :: Dimension a => [a]
arguments = enumFrom minBound

results :: (Dimension a) => (a -> r) -> [r]
results cube = fmap cube arguments


这允许我将立方体折叠一维,例如用所有结果的总和替换它:
sum2D :: (Dimension a, Dimension b, Num r) => (a->b->r) -> a -> r
sum2D = fmap (sum . results)


到目前为止一切顺利

但是 sum2D仅适用于具有二维的多维数据集。我可以为 3D 立方体编写一个类似的函数,为 4D 立方体编写另一个函数。我怀疑大多数尚未实现的操作将面临同样的问题。这意味着,我对 Hypercube 的抽象并不真正值得它的盐。

我不确定我是否从错误的角度开始,或者我是否尝试拥有任意数量的维度只是不符合类型安全。

任何建议将不胜感激。

最佳答案

不知道是什么 EqOrd限制是,但我会替换 EnumBounded来自 Finite .例如:

{-# LANGUAGE DeriveAnyClass #-}
data Age = Young | Adult | Old deriving (Enum, Bounded, Universe, Finite)

起初它不喜欢我们已经赢了。这里的区别在于存在这些:
instance (Finite a, Finite b) => Finite (a, b)
instance Finite ()

所以,现在,而不是 a -> b -> Double , 使用 (a,(b,())) -> Double .现在您可以旋转 n 维事物的前两个维度:
rotate :: ((a,(b,c)) -> r) -> ((b,(a,c)) -> r)
rotate cube2D (p,(a,rest)) = cube2D (a,(p,rest))

您可以沿所有维度求和:
sumNd :: (Finite a, Num r) => (a->r) -> r
sumNd f = sum [f a | a <- universeF]

关于haskell - 如何在 Haskell 中建模 OLAP 超立方体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61853288/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com