对于PersistFieldSql,GeneralizedNewtypeDeriving失败

 马岱五号_668 发布于 2022-12-20 20:25

我正在尝试定义Markdown newtype,并使用GeneralizedNewtypeDeriving自动定义新实例:

import Text.Markdown
import Yesod.Text.Markdown
import Database.Persist.Sql

newtype MarkdownNewT = MarkdownNewT { getMarkdown :: Markdown }
  deriving (Eq, IsString, Monoid, PersistField, PersistFieldSql)

对于PersistFieldSql以下消息,此操作失败:

Could not coerce from ‘m Markdown’ to ‘m MarkdownNewT’
  because ‘m Markdown’ and ‘m MarkdownNewT’ are different types.
  arising from the coercion of the method ‘sqlType’ from type
               ‘forall (m :: * -> *). Monad m => m Markdown -> SqlType’ to type
               ‘forall (m :: * -> *). Monad m => m MarkdownNewT -> SqlType’

这是由于GHC 7.8.2 的新角色功能吗?在那种特殊情况下,我不知道该怎么做,因为Markdown本身就是Text的新类型......

或者这与forallon有关sqlType?当所有其他实例成功自动派生时,出现此错误的原因是什么?

谢谢

1 个回答
  • 这看起来非常类似于VectorGHC wiki Roles2页面中与当前角色系统不兼容的一些示例(特别是一个),唉.

    基本上问题在于

    class PersistField a => PersistFieldSql a where
        sqlType :: Monad m => m a -> SqlType
    

    单子m可能与类型构造,其说法有标称的作用被实例化,从而使m Markdownm MarkdownNewT 相同的代表,即使MarkdownMarkdownNewT自己的-和当前角色系统没有限制的方式m来禁止这种类型的构造函数.

    2022-12-20 20:27 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有