Haskell 具有专门化规则的函数依赖
我想写一封信 对于Megaparsec组合器,因此该规则仅在输入类型为Haskell 具有专门化规则的函数依赖,haskell,ghc,megaparsec,Haskell,Ghc,Megaparsec,我想写一封信 对于Megaparsec组合器,因此该规则仅在输入类型为ByteString时触发 {-#语言明确表示} {-#语言重载字符串} {-#语言类型族{-} 导入数据。无效 导入文本.Megaparsec 将限定数据.ByteString作为B导入 组合:对于所有e s m a。(莫纳德帕塞克e s m) =>硕士 ->我是 combi=标签“字符串通用” combinByteString::对于所有e s m a。(MonadParsec e s m,s~B.通过测试环) =>硕士
ByteString
时触发
{-#语言明确表示}
{-#语言重载字符串}
{-#语言类型族{-}
导入数据。无效
导入文本.Megaparsec
将限定数据.ByteString作为B导入
组合:对于所有e s m a。(莫纳德帕塞克e s m)
=>硕士
->我是
combi=标签“字符串通用”
combinByteString::对于所有e s m a。(MonadParsec e s m,s~B.通过测试环)
=>硕士
->我是
combinByteString=标签“ByteString专用”
main=do
parseTest(组合空::Parsec空字符串)”
parseTest(组合空::Parsec Void B.ByteString字符串)”
{-#NOINLINE combi}
{-#NOINLINE combinebytestring}
{-#规则“combi/ByteString”combi=combinByteString#-}
当我尝试构建此功能时,它失败了:
$cabal v2运行
建造概况:-w ghc-8.6.5-O1
Main.hs:25:40:错误:
•无法将类型“s”与“B.ByteString”匹配
由约束之间的功能依赖性引起:
“MonadParsec e B.ByteString m”
因在Main使用“combinByteString”而产生。hs:25:40-55
“MonadParsec e s m”
源于Main.hs:25:11-55中的规则“combi/ByteString”
“s”是一个刚性类型变量,由
规则“combi/ByteString”
在Main.hs:25:11-55
•在表达式中:combinByteString
检查转换规则“combi/ByteString”时
|
25{-#规则“combi/ByteString”combi=combinByteString#-}
的输入流类型参数s
在Monad
参数m
上有一个
class(流s,MonadPlus m)=>MonadParsec e s m | m->es where
这里有一个specialize.cabal
文件用于尝试构建
cabal-version: >=1.10
name: specialize
version: 0.1.0.0
build-type: Simple
executable specialize
main-is: Main.hs
build-depends: base >= 4
,megaparsec
,bytestring
default-language: Haskell2010
如果成功,输出应如下所示:
1:1:
|
1 | <empty line>
| ^
expecting String generic
1:1:
|
1 | <empty line>
| ^
expecting ByteString specialized
1:1:
|
1 |
| ^
应为字符串泛型
1:1:
|
1 |
| ^
期望通过TestRing专门化
建议?此规则有效,但仅适用于GHC 8.8.1,不适用于GHC 8.6.5
{-#语言类型应用程序}
{-#规则“combi/ByteString”forall e.forall。
combi@e@B.ByteString=combinByteString@e@B.ByteString
#-}
此规则适用于GHC 8.6.5和8.0.2
{-#规则“combi/ByteString”
forall(pa::通过测试环m a解析e B。
combi@e@B.ByteString@(ParsecT e B.ByteString m)@a pa=
combinByteString@e@B.ByteString@(ParsecT e B.ByteString m)@a pa
#-}
看起来fundep希望s
遵循m
,因此对于相同的m
,不能有不同的s
(String
或ByteString
)。您是否尝试过通过测试a来修复m
,比如m~Parsec e
?@fyodor soykin我尝试过以类似于您所建议的方式修复m
,但我仍然无法构建它,即使它确实构建了它,也不太正确,因为我希望它适用于MonadParsec
的所有实例,不仅仅是ParsecT
。你必须有规则吗?您可以改为使用类型类吗?@FyodorSoikin我愿意尝试任何解决方案,但我不想以任何方式更改combin
的公共API类型签名。我不想向公共API添加任何特殊的类约束。是的,您完全可以使用ifcxt