获取记录字段的文本表示?

时间:2016-02-26 12:05:18

标签: database haskell field records typesafe

有以下记录:

onBindViewHolder()

有没有办法执行以下操作:

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

我需要这个用于类型安全的DB特定字段更新,即:

deriveSomething ''Sleep

fieldName duration :: String -- "duration"

它需要与数据库无关(因此setField connection key duration (Just 50) 等等)。

(如果可以通过opaleye这样的标准包更好地实现,但我找不到任何东西。)

1 个答案:

答案 0 :(得分:2)

您可以使用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)

这样您就不必重新计算它了。

相关问题