Как сделать магазин алгебраический тип данных в постоянном

StackOverflow https://stackoverflow.com//questions/22057994

  •  23-12-2019
  •  | 
  •  

Вопрос

для типа данных, как так

data Tree = Node String Tree Tree
          | Leaf String
.

и реальные данные, как так

my_tree = (Node "first node" (Leaf "leaf") (Node "second node" (Leaf "leaf") (Leaf "leaf")))
.

Как хранить это в базе данных, используя постоянную, конкретно, как сделать «или» часть?

Я пытался определить модель, как так

share [mkPersist sqlSettings, mkMigrate "migrateAll"] [persistLowerCase|
    Tree
        value String
        leftTree Leaf
        rightTree Leaf
        deriving Show
    Leaf
        value String
        deriving Show
|]
.

Рекурсивная структура будет храниться в столбце подряд в виде строки JSON автоматически, которая очень хорошая.Но как мы или можем определить «или» структуру в постоянной модели?

Это было полезно?

Решение

Персональный может хранить только рекламу, которые не имеют детских данных.ЯСледующее может быть сохранено:

data Tag = Leaf | Fork
.

Но рекурсивные структуры, такие как это, нельзя хранить без сериала, чтобы json:

data Tree a = (Leaf a) | Fork (Tree a) (Tree a)
.

Что вы должны понять, это то, что настойчивый - это настойчивый слой для экономии типа в верхней части базы данных, поэтому вы должны думать о вашей схеме с точки зрения того, что эффективно хранить в базе данных, не с точки зрения того, что удобноDatastructure Haskell.

share [mkPersist sqlSettings, mkMigrate "migrateAll"] [persistLowerCase|
    Tree
        parent TreeId Maybe
        value String
        deriving Show
|]
.

Эта схема даст вам эквивалент следующей структуры.

data Tree a = Value a [Tree a]
.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top