我想知道Haskell中的IORef是否合法使用?更具体地说,如果有人能够解决以下问题或指向适当的地方了解更多信息,我将感激不尽:
如果有人想要在程序中添加状态,那么状态monad不是更好(更纯粹)的方式.如果一个人感觉更加迫切,他还不能继续使用STM和MVar,还能更好吗?
是否有使用IORef而不是STM,MVar或纯IO轻松处理的编程方案?
我正在阅读一篇使用IORef作为代码片段的论文,由于我对IORef的负面看法,我很难读到这篇论文.我不想沉迷于我的无知,而是想让我的同伴Haskellers寻求帮助可能是一个更好的主意.
我试图使用bnfc工具为我生成一堆文件,如词法分析器,解析器等.这很好用.现在我想通过不必手动编译bnfc文件并让它生成一些混乱我的/src文件夹的文件来清理它.
我尝试了Cabal机制,您可以在build-tools该.cabal文件的字段中列出该工具,并提及您希望按extra-source-files字段生成的文件.这对我来说对Alex和Happy来说bnfc很有用,因为他们被Cabal认为是构建工具,但事实并非如此.有没有办法可以bnfc与Cabal 挂钩或使用任何工具,并让Cabal将它们识别为构建工具?
我正在为实验语言进行语义分析.我正在使用Alex和Happy来生成词法分析器和解析器(实际上我正在使用BNFC工具来生成Alex和Happy文件).每当出现语义错误(比如类型错误)时,我都想收到包含行号和列号的错误消息.
似乎我必须在构建符号表或AST时存储行号信息.如果我可以以某种方式访问Happy文件的规则部分中的位置信息,那么我的问题就会解决.
任何有关这方面的建议都将受到高度赞赏.
我尝试实现下面建议的答案,但遗憾的是没有取得任何成功.让我们考虑一个非常简单的语法: -
Expr -> Expr + Term
| Term
Term -> Int
Run Code Online (Sandbox Code Playgroud)
我的词法分析器如下所示.
%wrapper "posn"
$digit = 0-9 -- digits
$alpha = [a-zA-Z] -- alphabetic characters
tokens :-
$white+ ;
"--".* ;
$digit+ { \p s -> L {getPos = p , unPos = Tok_Int (read s) }}
\+ { \p s -> L {getPos = p , unPos = Tok_Plus} }
{
data L a = L{ getPos :: AlexPosn, unPos :: a } deriving (Eq,Show) …Run Code Online (Sandbox Code Playgroud)