Сбой GeneralizedNewtypeDeriving для PersistFieldSql
Я пытаюсь определить новый тип Markdown, и с помощью 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...
Или это связано с forall
на sqlType
? В чем причина этой ошибки, когда все остальные экземпляры были получены автоматически?
Спасибо
1 ответ
Это выглядит очень похоже на некоторые из примеров (в частности, Vector
1) увы, на странице вики GHC Roles2 о вещах, которые не работают с текущей системой ролей.
В основном проблема в том, что в
class PersistField a => PersistFieldSql a where
sqlType :: Monad m => m a -> SqlType
монада m
может быть создан с помощью конструктора типа, чей аргумент имеет номинальную роль, так что m Markdown
а также m MarkdownNewT
не представлены одинаково, даже если Markdown
а также MarkdownNewT
сами по себе - и нынешняя ролевая система не имеет возможности ограничить m
запретить конструкторы такого типа.