簡體   English   中英

獲取記錄字段的文本表示?

[英]Get textual representation of record field?

有以下記錄:

data Sleep = Sleep
   { _duration :: Maybe Int
   , _drunk :: Bool
   }

有沒有辦法做到以下幾點:

deriveSomething ''Sleep

fieldName duration :: String -- "duration"

我需要這個用於類型安全的DB特定字段更新,即:

setField connection key duration (Just 50)

它需要與DB無關(因此opaleye等已經出局)。

(如果使用像lens這樣的標准包裝可以實現更好,但我找不到任何東西。)

您可以使用Data.Data執行此操作:

{-# LANGUAGE DeriveDataTypeable #-}
import Data.Data

data Sleep = Sleep
    { _duration :: Maybe Int
    , _drunk :: Bool
    } deriving (Typeable, Data)

fieldNames :: Data a => a -> [String]
fieldNames = constrFields . toConstr

例:

> fieldNames (Sleep undefined undefined)
["_duration", "_drunk"]

在此之后,您必須決定如何將名稱轉換為數據庫列,但這應該相當容易。

這需要使用特定構造函數創建的值,請記住數據類型可以包含許多構造函數。 沒有辦法解決這個問題,但你可能會有類似的東西

sleepFieldNames :: [String]
sleepFieldNames = fieldNames (Sleep undefined undefined)

這樣你就不必繼續重新計算了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM