启用TypeFamilies使代码不再构建

Emm*_*ery 6 haskell ghc type-families

我有一个编码和工作的模块,但是我无法为它输入两个函数签名,因为要输入它们我必须启用TypeFamilies模块的扩展,当我这样做时,它不再构建.

对于其中一个我需要TypeFamilies因为它使用persisent/esqueleto函数.

我认为合适的类型是:

getByIds :: (PersistEntityBackend a ~ SqlBackend) =>
   EntityField a (Key a) -> [Key a] -> SqlPersistM [Entity a]
Run Code Online (Sandbox Code Playgroud)

(ghc建议更通用的签名)

另一个使用hsqml.

ghc建议这个签名,但我想它可以简化:

  prop :: forall tr b.
          (Marshal tr, Typeable b, MarshalMode tr ICanReturnTo () ~ Yes) =>
          String -> (b -> tr) -> Member (GetObjType (ObjRef b))
Run Code Online (Sandbox Code Playgroud)

底线是,没有TypeFamilies我不能写那些签名.TypeFamilies然而,在我启用的那一刻,代码将无法构建,我不明白为什么.错误看起来像一些多态函数突然变成单态.

错误输出相对较长,你可以在这里找到它.

我已经TypeFamilies在应用程序的其他几个模块中启用了没有问题,这使我能够使用SqlBackend&ICanReturnTo约束编写签名而没有问题.

该模块是否存在问题导致其无法构建TypeFamilies?或者我应该启用另一个扩展来修复它吗?我没想到只是启用该扩展来破坏编译.

And*_*ács 9

~只有拥有TypeFamiliesGADTs启用了类型相等约束才能写出.

但是,启用TypeFamiliesGADTs启用MonoLocalBinds.顾名思义,它禁用了本地定义变量的泛化.

如果MonoLocalBinds阻止编译代码,您应该写出通用类型签名或将这些本地因素分解为顶级定义.有时写出广义类型有点困难; 在这种情况下,您可以尝试查询GHCi,或者您可以启用NoMonomorphismRestriction,编写未注释的顶级定义,然后查看推断的类型.

  • `NoMonoLocalBinds`确实让它构建.我不知道那一个.现在我不明白它和"NoMonomorphismRestriction"之间的区别,但它们似乎几乎是一样的东西..无论如何我知道在哪里搜索现在谢谢你! (3认同)