作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想写一个specialization rewrite rule对于 Megaparsec 组合器,以便仅当输入类型为 ByteString
时才触发规则。
{-# LANGUAGE ExplicitForAll #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TypeFamilies #-}
import Data.Void
import Text.Megaparsec
import qualified Data.ByteString as B
combin :: forall e s m a. (MonadParsec e s m)
=> m a
-> m a
combin = label "String generic"
combinByteString :: forall e s m a. (MonadParsec e s m, s ~ B.ByteString)
=> m a
-> m a
combinByteString = label "ByteString specialized"
main = do
parseTest (combin empty :: Parsec Void String String) ""
parseTest (combin empty :: Parsec Void B.ByteString String) ""
{-# NOINLINE combin #-}
{-# NOINLINE combinByteString #-}
{-# RULES "combin/ByteString" combin = combinByteString #-}
当我尝试构建它时,它失败了:
$ cabal v2-run
Build profile: -w ghc-8.6.5 -O1
Main.hs:25:40: error:
• Couldn't match type ‘s’ with ‘B.ByteString’
arising from a functional dependency between constraints:
‘MonadParsec e B.ByteString m’
arising from a use of ‘combinByteString’ at Main.hs:25:40-55
‘MonadParsec e s m’
arising from the RULE "combin/ByteString" at Main.hs:25:11-55
‘s’ is a rigid type variable bound by
the RULE "combin/ByteString"
at Main.hs:25:11-55
• In the expression: combinByteString
When checking the transformation rule "combin/ByteString"
|
25 | {-# RULES "combin/ByteString" combin = combinByteString #-}
MonadParsec
的输入流类型参数s
有一个functional dependency在 Monad
参数 m
上。
class (Stream s, MonadPlus m) => MonadParsec e s m | m -> e s 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
建议?
最佳答案
此规则有效,但仅适用于 GHC 8.8.1,不适用于 GHC 8.6.5。
{-# LANGUAGE TypeApplications #-}
{-# RULES "combin/ByteString" forall e. forall.
combin @e @B.ByteString = combinByteString @e @B.ByteString
#-}
此规则适用于 GHC 8.6.5 和 8.0.2
{-# RULES "combin/ByteString"
forall (pa :: ParsecT e B.ByteString m a).
combin @e @B.ByteString @(ParsecT e B.ByteString m) @a pa =
combinByteString @e @B.ByteString @(ParsecT e B.ByteString m) @a pa
#-}
关于haskell - 具有特化规则的函数依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58560791/
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 4 年前。
正如您在 this travis.yml 中看到的那样文件,我的代码依赖于一些第三方库,我在构建项目之前将它们安装在远程系统上。 Travis 每次推送提交时都会下载并构建这些库,这可以避免吗?我的意
我是一名优秀的程序员,十分优秀!