有以下记录:
data Sleep = Sleep
{ _duration :: Maybe Int
, _drunk :: Bool
}
有没有办法做到以下几点:
deriveSomething ''Sleep
fieldName duration :: String -- "duration"
我需要它来更新类型安全的数据库特定字段,即:
setField connection key duration (Just 50)
虽然它需要与数据库无关(因此 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)
这样您就不必不断地重新计算它。
关于database - 获取记录字段的文本表示?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35651252/