【问题标题】:Generalizing the functions of a key/value database for both on disk (IO) and pure cases?为磁盘 (IO) 和纯案例概括键/值数据库的功能?
【发布时间】:2015-06-03 01:10:52
【问题描述】:

键值数据库的基本功能是storefetchdelete。我正在尝试编写一个类型类,允许这些函数的返回类型是纯的或 IO,这样我就可以编写一个适用于内存中 Data.Map 支持的实现和 on -磁盘实现。

pure 类型类可能看起来像这样:

class PureQueryable d where
  fetch  :: d -> Key -> Maybe Value
  insert :: d -> Key -> Value -> d
  delete :: d -> Key -> Maybe d

...而IO 类型类可能看起来像这样:

class IOQueryable d
  fetch  :: d -> Key -> IO (Maybe Value)
  insert :: d -> Key -> Value -> IO d
  delete :: d -> Key -> IO (Maybe d)

我正在尝试将这两者结合起来,正如某人 (Vektorweg1) 在#haskell 上所建议的那样,我写了这个:

class Queryable d r where
  fetch  :: d -> Key -> ??? 
  insert :: d -> Key -> Value -> ??? 
  delete :: d -> Key -> ??? 

我不确定要写什么来代替??? 才能使它起作用。有什么想法吗?

【问题讨论】:

  • 你为什么要开设这门课?这不是 Haskell 中适合的问题类。
  • 您还有什么建议吗?
  • 我的第一个问题是:你能从中得到什么?为了使抽象有意义,您需要能够高效地编写与您正在使用的实现无关的代码。您可以编写哪些高效的代码适用于任何实现?

标签: haskell typeclass


【解决方案1】:

和 Carl 一样,我也对它的实用性持怀疑态度,但这里什么也没有(请注意,我是在手机上打字,因此相关类型的语法可能完全错误):

{-# LANGUAGE TypeFamilies #-}

class Queryable (d :: * -> *) where
  type Key
  type M
  fetch :: d v -> Key -> M v
  insert :: d v -> Key -> v -> M v
  delete :: d v -> Key -> M ()

现在您可以使用任何函子来实例化该类:

instance Queryable IOIntDict where
  type Key IOIntDict = Int
  type M = IO
  ...

对于纯粹的东西,你使用Data.Functor.Identity 作为你的函子,或者只是使用身份类型系列(我不确定哪种方法实际上会更好)。

【讨论】:

  • 你会用什么来代替 typeclass?
  • @broma0,正如卡尔所说,真正的问题是“你到底想做什么?”您能想象一些您可能想要解决的问题,然后解释您所设想的通用接口将如何帮助您在它们之间共享代码吗?如果是这样,你可以用血淋淋的细节编辑你的问题。
  • 我要解决的问题是拥有一个可与 IO 和纯后端一起使用的数据库引擎。我认为这最好通过 typeclass 来完成
  • @broma0,您还没有解释为什么要这样做。你会如何使用它?能不能写个玩具程序来解释一下?
  • 想象一个由许多“桶”组成的键值数据库,每个桶都充当键到值的唯一映射。如果能够为一个存储桶使用内存后端(纯粹的,使用状态单子),而为另一个存储桶使用磁盘(IO)后端,那就太好了。由于我希望我的引擎,即处理数据库存储和索引的代码尽可能简洁和多态,我需要一些方法来抽象每个存储桶的“后端”。如果这个解释仍然不够充分,我会在我的问题中添加更多代码。
猜你喜欢
  • 2011-02-15
  • 2012-04-28
  • 2014-04-06
  • 1970-01-01
  • 2014-12-10
  • 2015-01-05
  • 2013-11-21
  • 1970-01-01
相关资源
最近更新 更多