Saya memiliki Aplikasi Hamba Haskell. Saya ingin membaca dari file dan mengisi database dengan isi file. Apa yang saya miliki adalah ini

userList :: IO [User]
productList :: IO [Product]

data User = User { age :: Int, fname :: String, lname :: String }
data Product = Product { title :: String, description :: String }
data Item = UserI User | ProductI Product

listUsers :: Handler [Entity User]
listProducts :: Handler [Entity Product]

hydrateUserDB :: Handler [Entity User]
hydrateUserDB = do
    items <- liftIO userList
    let list = fmap User items
    traverse_ createUser list
    listUsers

hydrateProductDB :: Handler [Entity Product]
hydrateProductDB = do
    items <- liftIO productList
    let list = fmap Product items
    traverse_ createProduct list
    listProducts

Sekarang saya ingin satu fungsi yang dapat mengambil Pengguna atau Produk dan menghasilkan hasil yang sama seperti di atas. Sesuatu seperti:

hydrateDB :: Handler [Entity a]
hydrateDB =
    \alist con createItem listItems -> do
    items <- liftIO alist
    let list = fmap con items
    traverse_ createItem list
    listItems
1
7puns 15 Maret 2019, 02:00

1 menjawab

Jawaban Terbaik

Ini mungkin penggunaan yang baik untuk kelas tipe. Letakkan hal-hal yang berbeda dari satu versi ke versi lainnya di dalam kelas. Desainnya mungkin bisa diperbaiki, tetapi ini adalah langkah pertama:

class DBItem a where
    itemList :: IO [a]
    createItem :: a -> Handler ()
    listItems :: Handler [Entity a]

instance DBItems User where
    itemList = userList
    createItem = ...
    listItems = listUsers

instance DBItems Product where
    itemList = productList
    ...

hydrateDB :: (DBItem a) => Handler [Entity a]
hydrateDB = do
    items <- liftIO itemList
    traverse_ createItem items
    listItems

(Saya membuat beberapa perubahan untuk membuat tipenya masuk akal, tetapi Anda mendapatkan idenya)

4
luqui 14 Maret 2019, 23:16