有以下记录的:
data Sleep = Sleep
{ _duration :: Maybe Int
, _drunk :: Bool
}
有没有办法做到以下几点:
deriveSomething ''Sleep
fieldName duration :: String -- "duration"
我需要它来进行类型安全数据库特定字段的更新,即:
setField connection key duration (Just 50)
它需要是数据库不可知的(因此opaleye
等就不存在了)。
(如果这可以用像lens
这样的标准包来实现,那就更好了,但是我什么也找不到。)
发布于 2016-02-26 13:59:49
您可以使用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)
这样你就不必不断地重新计算它了。
https://stackoverflow.com/questions/35651252
复制