小编T. *_*ter的帖子

Haskell中的路径依赖类型

我正在尝试为Haskell中的某个数据库系统设计一个API,我想以这样一种方式对这个数据库的列建模,使得不同表的列之间的交互不会混淆.

更确切地说,假设您有一个类型来表示数据库中的表,与某些类型相关联:

type Table a = ...
Run Code Online (Sandbox Code Playgroud)

并且您可以提取表的列以及列的类型:

type Column col = ...
Run Code Online (Sandbox Code Playgroud)

最后,有各种提取器.例如,如果您的表包含青蛙的描述,则可以使用函数提取包含青蛙重量的列:

extractCol :: Table Frog -> Column Weight
Run Code Online (Sandbox Code Playgroud)

这是一个问题:我想区分列的来源,以便用户不能在表之间进行操作.例如:

bullfrogTable = undefined :: Table Frog
toadTable = undefined :: Table Frog
bullfrogWeights = extractCol bullfrogTable
toadWeights = extractCol toadTable
-- Or some other columns from the toad table
toadWeights' = extractCol toadTable
-- This should compile
addWeights toadWeights' toadWeights
-- This should trigger a type error
addWeights bullfrogWeights toadWeights
Run Code Online (Sandbox Code Playgroud)

我知道如何在Scala中实现这一点(使用路径依赖类型,参见[1]),我一直在考虑Haskell中的3个选项:

  • 不使用类型,只是在运行时进行检查(当前的解决方案)

  • TypeInType扩展,用于在Table类型本身上添加幻像类型,并将此额外类型传递给列.我并不热衷于此,因为这种类型的构造会非常复杂(表是通过复杂的DAG操作生成的),并且在这种情况下编译可能会很慢.

  • 使用forall类似于ST monad 的构造包装操作,但在我的情况下,我希望额外的标记类型实际上逃避构造. …

haskell

13
推荐指数
1
解决办法
364
查看次数

标签 统计

haskell ×1