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?或者我应该启用另一个扩展来修复它吗?我没想到只是启用该扩展来破坏编译.
~只有拥有TypeFamilies或GADTs启用了类型相等约束才能写出.
但是,启用TypeFamilies或GADTs启用MonoLocalBinds.顾名思义,它禁用了本地定义变量的泛化.
如果MonoLocalBinds阻止编译代码,您应该写出通用类型签名或将这些本地因素分解为顶级定义.有时写出广义类型有点困难; 在这种情况下,您可以尝试查询GHCi,或者您可以启用NoMonomorphismRestriction,编写未注释的顶级定义,然后查看推断的类型.
| 归档时间: |
|
| 查看次数: |
108 次 |
| 最近记录: |