【发布时间】:2021-04-18 22:53:26
【问题描述】:
我正在尝试在 Haskell 中构建 FCA 类型的格型数据结构,我可以在其中检查两个实体是否有连接。实际上,我什至不确定格子是否是正确的结构,因为它可能有点“太多”。
这里是上下文。在 COBOL 程序分析器中,我有一个数据集名称、文件、记录和字段的本体。根据程序的不同,一个数据集名称可以有多个文件名,一个文件可以有多个记录,一个记录可以有多个字段。我希望这种层次结构反映在 Haskell 数据结构中。但我也希望能够为 file1 和 file2 继承关系,以便我可以检查 file1 和 file2 是否属于相同的数据集名称。实际上,这种关系几乎可以是“==”的关系。但也可能只是因为它们在 dsn0 中有一个连接,例如。
在这种情况下,我还有其他可以从格或 FCA 数据结构中受益的本体。例如,我有属于作业步骤的程序和属于作业的作业步骤。如果我能很容易地弄清楚两个程序是否属于同一个工作,那就太好了。在这里,它似乎也是一个“加入”运算符。获取某个实体的扩展名(代码)也会很有用。
我对 Haskell 还是有点陌生。我试图查看the Lattice library,但具体而言,我不确定从那里去哪里。知道如何开始吗? Haskell 中格子的一个小例子会很有帮助。非常感谢您的帮助(和耐心)。
更新: 正如 cmets 中提到的,Lattice 可能不是最好的形式。我意识到我可能只需要按照这些思路使用常规类类型的数据结构:
data DSN = DSN {
programFiles :: [ProgramFile]
name :: String
ddn :: DDN
}
data ProgramFile = ProgramFile {
records :: [Record]
name :: String
}
data Record = Record {
fields :: [Field]
name :: String
}
data Field = Field {
name :: String
order :: Int
}
我想我使用树/格/FCA 类型结构的最初意图是充分利用 Haskell 中的函子潜力,这应该会导致有趣的格操作,包括获得一个概念的所有扩展,检查两个概念属于同一个更高级的概念,通过它们的 DSN 检查两个文件的相等性 '==',...
也许非二叉树结构会更好?在 Haskell 中很容易做到这一点吗?
【问题讨论】:
-
就我理解你想要做什么的程度而言......听起来“属于”的感觉有所不同;并且一个实体可能以不同的方式属于其他实体(或者可能以多种方式属于同一个实体?)然后我不确定格子是正确的结构——所有的“属于”都是同一个意义上的。我会将所有链接展平到关系数据库中。编程语言内的数据结构似乎不是适合这项工作的工具。
-
一个数据集可以有多个文件。一个文件可以属于多个数据集吗?如果不是,您是否希望将该约束融入到类型中,或者您是否愿意自己维护一个未经编译器检查的不变量?
-
感谢@DanielWagner 提出这些非常好的澄清问题。事实上,格子可能不是最好的形式。我意识到我可能只需要使用常规类类型的数据结构:DSN = DSN { programFiles :: [ProgramFile] name :: String ddn :: DDN } data ProgramFile = ProgramFile { records :: [Record] name :: String } ... 我想我使用树/格/FCA 类型结构的最初意图是充分利用 Haskell 中的函子潜力,这应该会导致有趣的格操作。
-
感谢@AntC 的评论。我在上面回答,因为两个 cmets 都朝着相同的方向前进。
-
@HugolinBergier 我不认为您的编辑或评论实际上回答了我的澄清问题。你能再刺他们一次吗?我有几个具体的解决方案,但哪一个最合适取决于这些问题的答案。
标签: haskell ontology lattice formal-semantics