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の新しいタイプであるため、どうすればよいかわかりません...
それとも、これはforall
オンに関連していsqlType
ますか?他のすべてのインスタンスが正常に自動的に派生した場合、このエラーの理由は何ですか?
ありがとう
これはVector
、残念ながら、現在のロールシステムでは機能しないもののGHC wiki Roles2ページのいくつかの例(特に1つ)と非常によく似ています。
基本的に問題は
class PersistField a => PersistFieldSql a where
sqlType :: Monad m => m a -> SqlType
モナドはm
そのため、その引数名目的な役割を持っているタイプのコンストラクタでインスタンス化されるかもしれないm Markdown
とm MarkdownNewT
されていない同一の場合でも、表現Markdown
とMarkdownNewT
自身がある-と現在の役割システムは、制限のない方法がありませんm
、このようなタイプのコンストラクタを禁止することを。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加