Сбой 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 запретить конструкторы такого типа.

Другие вопросы по тегам