Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 具有专门化规则的函数依赖_Haskell_Ghc_Megaparsec - Fatal编程技术网

Haskell 具有专门化规则的函数依赖

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.通过测试环) =>硕士

我想写一封信 对于Megaparsec组合器,因此该规则仅在输入类型为
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