我开始做项目欧拉并得到问题9.由于我使用Project Euler来学习Haskell,我决定使用列表推导(如Learn You A Haskell中所示).我这样做,GHCI需要一段时间来弄清楚三元组,由于涉及的计算,我认为这是正常的.现在,昨天上班(我不是专业的程序员),我正在和一位了解VBA的朋友交谈,他想尝试在VBA找到答案.我认为这也是一个有趣的挑战,我为ch循环和if语句制作了一些基本的东西,但是我得到的是它比Haskell快得多.
我的问题是:Haskell的列表理解是否非常低效?起初我以为这只是因为我处于GHC的交互模式,但后来我意识到VBA也被解释了.
请注意,我没有发布我的代码,因为它是项目euler的答案.如果它会回答我的问题(因为我做错了),那么我很乐意发布代码.
[编辑]这是我的Haskell列表理解:
[(a,b,c) | c <- [1..1000], b <- [1..c], a <- [1..b], a+b+c=1000, a^2+b^2=c^2]
我想我可以降低c的范围,但是真正放慢它的速度是什么?
我正在参加计算机系统课程作为我的硕士课程的预先要求,并且遇到了一些令我着迷并且很难看到实际用途的东西,那就是"伪造减法"以及不需要减法的事实指令.
就像是:
x - y
可以写成:
x +(~y + 1)
现在,这一切都很好,但似乎对于简单的减法来说过于复杂,特别是当你可以轻松地放入"x - y"时.是否有必要这样做的情况,或者只是可以做但不是的事情.
我正在教自己CIL并且到目前为止一直做得很好(昨天真的开始)但我遇到了一个我无法弄清楚的问题.我正在提示用户输入一个int(int32),然后将其存储并转换为浮点并显示它.然而,无论我输入什么都是不同的浮动.这是我的代码:
.assembly variables {}
.method public static void main() cil managed
{
.entrypoint
.maxstack 8
.locals init (float64)
ldstr "Enter a digit: "
call void [mscorlib]System.Console::WriteLine(string)
call int32 [mscorlib]System.Console::Read()
conv.r8
stloc.0
ldstr "as a float: "
call void [mscorlib]System.Console::WriteLine(string)
ldloc.0
dup
call void [mscorlib]System.Console::Write(float64)
stloc.0
ldstr "Stored in location 0"
call void [mscorlib]System.Console::WriteLine(string)
ldloc.0
conv.i4
call void [mscorlib]System.Console::WriteLine(int32)
call int32 [mscorlib]System.Console::Read() // to pause before closing window
pop
ret
}
Run Code Online (Sandbox Code Playgroud)
我只是在和CIL搞砸,但我觉得为了清晰起见,我会把整个例子都扔进去.它编译得很好但是当我输入5时它返回53作为浮点数和转换后的int32.
有人可以说明我做错了什么!
编辑:感谢Marc Gravell,我能够弄明白.对于那些感兴趣的人,这里是正确的代码:
.assembly variables {}
.method …Run Code Online (Sandbox Code Playgroud) 我有一个人员列表,可以发生4种类型,每种类型有5种分辨率.我正在尝试编写单个查询,以便我可以为每个人提取每种类型/分辨率组合但遇到问题.这是我到目前为止:
SELECT person,
TypeRes1 = (SELECT COUNT(*) FROM table1 where table1.status = 45)
JOIN personTbl ON personTbl.personid = table1.personid
WHERE person LIKE 'A0%'
GROUP BY person
Run Code Online (Sandbox Code Playgroud)
我已经调整了列名以使其更加通用,但基本上人员表中有几百人,我只想要A01到A09,所以like语句是最简单的方法.问题是我的结果最终是这样的:
Person TypeRes1
A06 48
A04 48
A07 48
A08 48
A05 48
Run Code Online (Sandbox Code Playgroud)
这是不正确的.我无法弄清楚如何让每个人的列数正确.我尝试过这样的事情:
SELECT person as p,
TypeRes1= (SELECT COUNT(*) FROM table1
JOIN personTbl ON personTbl.personid = table1.personid
WHERE table1.status = 45 AND personTbl.person = p)
FROM table1
JOIN personTbl ON personTbl.personid = table1.personid
WHERE personTbl.person LIKE 'A0%'
GROUP BY personTbl.person
Run Code Online (Sandbox Code Playgroud)
但这给了我错误:无效的列名'p'.是否可以将p传递到子查询中,还是有其他方法可以执行此操作?
编辑:有19种不同的状态,所以会有19种不同的TypeRes,为了简洁起见,我只想把它放在一个好像我能找到它,我想我可以自己做其余的.
我打算编写一个针对.NET平台的编程语言,这让我开始考虑定位这样一个平台的代码生成方面.我是编写编译器的新手,但我知道在编译(或可能存在)的过程中有一个优化完成.我开始怀疑花时间优化输出有什么好处(在这种情况下是CIL,但这也适用于JVM),因为JIT编译器和JVM的HotSpot之类的东西可以在运行时进行优化.由于JIT已经优化,因此在针对.NET或JVM时优化生成的代码(CIL或等效的JVM)有什么好处吗?