[英]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.