如何在持久化中存储代数数据类型

HHC*_*HHC 8 haskell persistent yesod

对于像这样的数据类型

data Tree = Node String Tree Tree
          | Leaf String
Run Code Online (Sandbox Code Playgroud)

和真实的数据一样

my_tree = (Node "first node" (Leaf "leaf") (Node "second node" (Leaf "leaf") (Leaf "leaf")))
Run Code Online (Sandbox Code Playgroud)

如何使用持久性将其存储到数据库中,具体如何执行"OR"部分?

我试过像这样定义模型

share [mkPersist sqlSettings, mkMigrate "migrateAll"] [persistLowerCase|
    Tree
        value String
        leftTree Leaf
        rightTree Leaf
        deriving Show
    Leaf
        value String
        deriving Show
|]
Run Code Online (Sandbox Code Playgroud)

递归结构将作为json字符串自动存储在一行中的列中,这非常好.但是我们如何或者可以在持久模型中定义"OR"结构?

Tho*_*mas 9

Persistent只能存储没有子数据的ADT.IE可以存储以下内容:

data Tag = Leaf | Fork
Run Code Online (Sandbox Code Playgroud)

但是如果没有将它序列化为JSON,则无法存储这样的递归结构:

data Tree a = (Leaf a) | Fork (Tree a) (Tree a)
Run Code Online (Sandbox Code Playgroud)

您必须了解的是Persistent是数据库顶部的类型保存层,因此您必须根据存储在数据库中的有效内容来考虑您的模式,而不是根据方便的Haskell数据结构.

share [mkPersist sqlSettings, mkMigrate "migrateAll"] [persistLowerCase|
    Tree
        parent TreeId Maybe
        value String
        deriving Show
|]
Run Code Online (Sandbox Code Playgroud)

此架构将为您提供以下结构的等效项.

data Tree a = Value a [Tree a]
Run Code Online (Sandbox Code Playgroud)