小编tty*_*lec的帖子

解析错误导致的自动完成建议

我正在使用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)

parsing haskell megaparsec

9
推荐指数
0
解决办法
115
查看次数

在MonadState中中断冗长的纯计算

我无法掌握在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)

concurrency haskell signals state-monad monad-transformers

6
推荐指数
1
解决办法
99
查看次数