首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >是否获取记录字段的文本表示形式?

是否获取记录字段的文本表示形式?
EN

Stack Overflow用户
提问于 2016-02-26 20:05:18
回答 1查看 65关注 0票数 3

有以下记录的:

代码语言:javascript
运行
复制
data Sleep = Sleep
   { _duration :: Maybe Int
   , _drunk :: Bool
   }

有没有办法做到以下几点:

代码语言:javascript
运行
复制
deriveSomething ''Sleep

fieldName duration :: String -- "duration"

我需要它来进行类型安全数据库特定字段的更新,即:

代码语言:javascript
运行
复制
setField connection key duration (Just 50)

它需要是数据库不可知的(因此opaleye等就不存在了)。

(如果这可以用像lens这样的标准包来实现,那就更好了,但是我什么也找不到。)

EN

回答 1

Stack Overflow用户

发布于 2016-02-26 21:59:49

您可以使用Data.Data来完成此操作

代码语言:javascript
运行
复制
{-# LANGUAGE DeriveDataTypeable #-}
import Data.Data

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

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

示例:

代码语言:javascript
运行
复制
> fieldNames (Sleep undefined undefined)
["_duration", "_drunk"]

在此之后,您必须决定如何将名称转换为数据库列,但这应该很容易。

这需要一个使用特定构造函数创建的值,记住数据类型可以有许多构造函数。实际上没有办法解决这个问题,但是你可以像这样

代码语言:javascript
运行
复制
sleepFieldNames :: [String]
sleepFieldNames = fieldNames (Sleep undefined undefined)

这样你就不必不断地重新计算它了。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35651252

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档