我正在使用megaparsec为自定义jupter内核编写解析器.我能够重新使用解析器来提供完成:从megaparsec库生成的自定义错误消息被转换为预期符号列表.就这样,每当我更改解析器时,完成都会自动调整自身.哪个好.
我唯一困难的是如何从可选的解析器中获取信息.说明我想要实现的目标的最小例子如下:
{-# LANGUAGE OverloadedStrings #-}
module Main where
import Control.Applicative
import Text.Megaparsec
import Text.Megaparsec.Char
import qualified Text.Megaparsec.Char.Lexer as L
import Data.Monoid
import Data.Text (Text)
import Data.Set (singleton)
type Parser = Parsec MyError Text
data MyError = ExpectKeyword Text deriving (Eq, Ord, Show)
lexeme = L.lexeme sc
sc = L.space (skipSome (oneOf [' ', '\t'])) empty empty
-- | Reserved words
rword :: Text -> Parser Text
rword w = region (fancyExpect (ExpectKeyword w)) $
lexeme (string w …Run Code Online (Sandbox Code Playgroud) 我无法掌握在SIGINT信号上中断冗长的纯计算的正确方法.
在下面的简单示例中,我有slowFib一个模拟冗长计算的函数.当它在IOmonad中运行时,我可以用Cc终止它(使用异步生成worker).
但是,当我将计算放在MonadState, MonadIO堆栈中时,它不再起作用......另一方面,threadDelay在同一堆栈中的简单仍然可以终止.
代码如下:
{-# LANGUAGE FlexibleContexts #-}
module Main where
import Data.Monoid
import Control.DeepSeq
import Control.Concurrent
import Control.Concurrent.Async
import Control.Monad.State
-- import Control.Monad.State.Strict
import System.Posix.Signals
slowFib :: Integer -> Integer
slowFib 0 = 0
slowFib 1 = 1
slowFib n = slowFib (n - 2 ) + slowFib (n - 1)
data St = St { x :: Integer } deriving (Show)
stateFib :: (MonadState St m, MonadIO m) => …Run Code Online (Sandbox Code Playgroud)