这是不可能的。
(^.) :: (PersistEntity val, PersistField typ)
=> expr (Entity val)
-> EntityField val typ
-> expr (Value typ)
你会发现第二个论点是
EntityField val typ
,它是在
PersistEntity val
上课。这是为您的表预定义的,并且不能更改,因此此特定运算符不能按您所需的方式用于自定义访问器。
当你使用
persistLowerCase
朋友们,它使用模板Haskell解析您的定义并生成适当的数据定义。据我所知,会产生如下类似的结果:
data Account = Account
{ accountEmail :: Text
, accountPassphrase :: Text
, accountFirstName :: Text
, accountLastName :: Text
}
data AccountField a where
AccountId :: AccountField Key
AccountEmail :: AccountField Text
AccountPassphrase :: AccountField Text
AccountFirstName :: AccountField Text
AccountLastName :: AccountField Text
instance PersistEntity Account where
data EntityField Account a = AccountField a
...
(这在语法上不准确,而且缺少很多细节,但我认为它为这种情况提供了足够的上下文。)
所以你传递给的“镜头”
(^.)
实际上只是与表类型关联的类型的构造函数
Account
. 不能创建新的构造函数或动态地重新关联类型族,因此不能生成可以传递给
(^.)
. 这些存取器实际上是用石头固定的。
我认为使用原始函数是最有意义的。
accountFullName acc
写起来也不错,而且很明显你做的事情比仅仅提取字段值要复杂一些。