请参阅以下网址提供的源代码:https://gist.github.com/1684022.
我定义了两个令牌:
ID : ('a'..'z' | 'A'..'Z') ('0'..'9' | 'a'..'z' | 'A'..'Z' | ' ')*;
PITCH
: (('A'|'a') '#'?)
| (('B'|'b') '#'?)
| (('C'|'c') '#'?);
Run Code Online (Sandbox Code Playgroud)
显然,字母"A"将是一种模糊性.
我进一步定义:
note : PITCH;
name : ID;
main : name ':' note '\n'?
Run Code Online (Sandbox Code Playgroud)
现在,如果我输入"A:A"作为解析器的输入,我总是会收到错误.解析器需要PITCH或ID,具体取决于是先定义ID还是PITCH:
mismatched input 'A' expecting ID
Run Code Online (Sandbox Code Playgroud)
解决这个问题的正确方法是什么,以便按预期工作?
如上所述,虽然直观地解释了解析应该如何工作,但ANTLR并没有做"正确的事".也就是说,即使main规则说a name/ ID应该首先出现,但是词法分析者似乎对此一无所知并将"A"标识为a,PITCH因为它遵循"最长匹配"/"首先出现"规则而不是更合理"什么规则说"规则.
通过匹配ID和PITCH,然后像dasblinkenlight所说的那样重新组合它们是假冒/破解它的唯一解决方案吗?
使用以下示例模块:
module Exp ( initial, myval ) where
data State = State { i :: Int }
initial = State { i = 123 }
myval st = i st
Run Code Online (Sandbox Code Playgroud)
在GHCI中加载模块后,我可以看到State和i名称也已导出.我可以得到他们的类型并使用它们.如何限制导出以便仅导出initial(黑盒子)并myval导出?
我之前的另一个Haskell优化问题.我需要递归生成一个列表,类似于许多介绍性Haskell文章中的fibs函数:
generateSchedule :: [Word32] -> [Word32]
generateSchedule blkw = take 80 ws
where
ws = blkw ++ zipWith4 gen (drop 13 ws) (drop 8 ws) (drop 2 ws) ws
gen a b c d = rotate (a `xor` b `xor` c `xor` d) 1
Run Code Online (Sandbox Code Playgroud)
上面的函数已经超过了我的最多时间和alloc-consume功能.分析器给出了以下统计信息:
COST CENTRE MODULE %time %alloc ticks bytes
generateSchedule Test.Hash.SHA1 22.1 40.4 31 702556640
Run Code Online (Sandbox Code Playgroud)
我想过应用未装箱的向量来计算列表,但由于列表是递归的,因此无法找到方法.这将在C中有一个自然的实现,但我没有看到一种方法来使这更快(除了展开和写80行变量声明).有帮助吗?
更新:我实际上已经快速展开它以查看它是否有帮助.代码在这里.它很难看,实际上它比较慢.
COST CENTRE MODULE %time %alloc ticks bytes
generateSchedule GG.Hash.SHA1 22.7 27.6 40 394270592
Run Code Online (Sandbox Code Playgroud) 当我试图编写有限状态机时,我刚刚遇到Haskell中的"无限类型".我认为以下内容非常直观:
fsm [] _ acc = Right acc
fsm (x:xs) state acc =
case state acc x of
Left err -> Left err
Right (s, a) -> fsm xs s a
Run Code Online (Sandbox Code Playgroud)
我给状态函数提供当前状态(累加器)和新事件,状态函数与新累加器一起产生下一个状态函数.我递归,直到我没有更多的事件.
编译器告诉我:
Occurs check: cannot construct the infinite type:
t1 = b0 -> t0 -> Either a0 (t1, b0)
In the second argument of `fsm', namely `s'
Run Code Online (Sandbox Code Playgroud)
因为state现在是无限型.如何重新排列以使其工作?
我可以创建一个CALayer使用[CALayer layer],然后使用圆角layer.cornerRadius = x.
我这样做后,我有一个圆角矩形图层.我可以将这个圆角矩形轮廓提取为路径,而无需自己重新创建路径吗?
当我list-packages在Emacs 24上运行时,我得到一个类似于以下内容的屏幕:

问题在于许多软件包的名称都比软件包列长。如何扩大此列的范围,以便可以看到完整的软件包名称?
我使用以下命令在沙箱中创建了一个cabal库:
cabal sandbox init
cabal init
Run Code Online (Sandbox Code Playgroud)
我添加了一行documentation: True以cabal.config确保生成文档,并且我在vector包中添加了依赖项mylib.cabal.然后我跑了:
cabal install --only-dependencies
Run Code Online (Sandbox Code Playgroud)
我得到以下输出:
/scm/hs-proj/.cabal-sandbox
Configuring primitive-0.6...
Building primitive-0.6...
Installed primitive-0.6
Configuring vector-0.10.12.3...
Building vector-0.10.12.3...
Installed vector-0.10.12.3
Updating documentation index
/scm/hs-proj/.cabal-sandbox/share/doc/x86_64-osx-ghc-7.10.1/index.html
Run Code Online (Sandbox Code Playgroud)
到现在为止还挺好.
当我打开索引文件时,它包含许多包的链接,例如:
file:///scm/hs-proj/.cabal-sandbox/share/doc/x86_64-osx-ghc-7.10.1/Data-List.html
file:///scm/hs-proj/.cabal-sandbox/share/doc/x86_64-osx-ghc-7.10.1/Data-Vector.html
Run Code Online (Sandbox Code Playgroud)
但是这些链接指向任何真实文件.请注意,这是额外依赖项的情况vector,也适用于内置包列表Data.List.
所以我认为我已经错误地安装了文档.有人可以指出我是如何错误地安装文档以及如何正确地执行此操作的?
在关于类型提示的Clojure文档中,它有关于类型提示和强制如何使代码运行得更快的以下示例:
(defn foo [n]
(loop [i 0]
(if (< i n)
(recur (inc i))
i)))
(time (foo 100000))
"Elapsed time: 0.391 msecs"
100000
(defn foo2 [n]
(let [n (int n)]
(loop [i (int 0)]
(if (< i n)
(recur (inc i))
i))))
(time (foo2 100000))
"Elapsed time: 0.084 msecs"
100000
Run Code Online (Sandbox Code Playgroud)
如果您运行此代码(set! *warn-on-reflection* true),它不会显示反射警告.是否需要程序员试错才能看出这些装饰品在哪些方面有所不同?或者是否有工具指示有问题的区域?
foldAllP :: (Shape sh, Source r a, Elt a, Unbox a, Monad m) => (a -> a -> a) -> a -> Array r sh a -> m a
foldAllS :: (Shape sh, Source r a, Elt a, Unbox a) => (a -> a -> a) -> a -> Array r sh a -> a
Run Code Online (Sandbox Code Playgroud)
我想将repa数组折叠成可以传递给GUI库以呈现的数据结构,即任意值,但是我找不到库中的函数来执行此操作。这个功能存在[... | x <- [0..w-1], y <- [0..h-1]]吗?还是我必须使用来遍历单元格?
我今天尝试从Haskell"Simple Servers"维基页面运行一些示例代码:
import Network
import Control.Concurrent
import System.IO
main = withSocketsDo $ do
sock <- listenOn $ PortNumber 5002
loop sock
loop sock = do
(h,_,_) <- accept sock
forkIO $ body h
loop sock
where
body h = do
hPutStr h msg
hFlush h
hClose h
msg = "HTTP/1.0 200 OK\r\nContent-Length: 5\r\n\r\nPong!\r\n"
Run Code Online (Sandbox Code Playgroud)
我在装有El Capitan的Mac上做这个.
当我尝试使用httperf网页上指示的方式运行此代码时,我在控制台上收到以下错误消息:
ep1: <socket: 29>: hPutChar: resource vanished (Broken pipe)
ep1: <socket: 29>: hPutChar: resource vanished (Broken pipe)
ep1: <socket: 29>: hPutChar: …Run Code Online (Sandbox Code Playgroud)