想想我正在调用它的副作用的函数,而不是返回值(比如打印到屏幕,更新GUI,打印到文件等).
def fun_with_side_effects(x):
...side effects...
return y
Run Code Online (Sandbox Code Playgroud)
现在,是Pythonic使用列表推导来调用这个函数:
[fun_with_side_effects(x) for x in y if (...conditions...)]
Run Code Online (Sandbox Code Playgroud)
请注意,我不会将列表保存在任何位置
或者我应该像这样调用这个函数:
for x in y:
if (...conditions...):
fun_with_side_effects(x)
Run Code Online (Sandbox Code Playgroud)
哪个更好?为什么?
我试图理解逻辑编程语言(在我的例子中是Prolog)和Haskell的类型系统之间的关系.
我知道两者都使用统一和变量来根据关系查找值(或类型,在Haskell的类型系统中).作为练习更好地理解它们之间的相似点和不同点的练习,我尝试在Haskell的类型级别中重写一些简单的prolog程序,但是我遇到了一些问题.
首先,我重写了这个简单的prolog程序:
numeral(0).
numeral(succ(X)) :- numeral(X).
add(0,Y,Y).
add(succ(X),Y,succ(Z)) :- add(X,Y,Z).
Run Code Online (Sandbox Code Playgroud)
如:
class Numeral a where
numeral :: a
numeral = u
data Zero
data Succ a
instance Numeral Zero
instance (Numeral a) => Numeral (Succ a)
class (Numeral a, Numeral b, Numeral c) => Add a b c | b c -> a where
add :: b -> c -> a
add = u
instance (Numeral a) => Add a Zero a
instance (Add x y z) => Add …Run Code Online (Sandbox Code Playgroud) 我无法加载CoqIde中相同文件夹中的模块.
我试图从软件基金会加载来源,我跑在包含SF sources文件夹coqide coqide或coqide ./,然后打开并运行该文件后,我得到这个错误:
Error: Cannot find library Poly in loadpath
Run Code Online (Sandbox Code Playgroud)
在这一行:
Require Export Poly.
Run Code Online (Sandbox Code Playgroud)
并且对于其他所有require命令都是一样的.
那么你们如何将程序从SF加载到coqide?
我有一个Java程序,可以解析几个不同的输入文件.即使在此输入文件中发现错误,解析仍可继续并收集其他几个错误.所以我想做的不是抛出异常并停止解析过程,我想将异常注册到某个地方,然后继续解析并以类似的方式收集其他几个错误,最后我想检查是否报告任何错误,并根据此情况失败或继续.
当然,我总是可以通过编写ExceptionRegister或任何类来手动执行此操作,但我想知道两件事:
1)这种方法有问题吗?你知道我想做什么的替代设计吗?
2)有这样做的标准方法吗?(例如,如果可能的话,我不想滚动我自己的类,我想使用内置功能)
谢谢
编辑:我不知道为什么但是在我接受他的答案之前,有人刚刚删除了他的答案.无论如何,我认为简单的数据结构应该有效.基本上,我将编写一个收集多个错误消息的异常类.然后我将调用它的throw方法,如果它至少注册了一条错误消息,则抛出该方法.
EDIT2:这里有更多的说明.我的问题与解析无关.解析只是一个例子,因为我的程序做了一些解析.想一想:我正在运行一个算法,如果出现错误,我可以继续算法收集更多错误,这样就不会打印出一个错误,当它被修复时,打印出第二个错误,我可以将这两个错误一起打印出来.
我正在研究用C编写的简单堆栈机器,主要用于学习目的.在malloc/free用于我的内存操作后,我认为从现代虚拟机中读取一些特定于内存分配的代码是个好主意.
我下载了Lua源代码并开始阅读它.过了一会儿,我意识到涉及很多宏的东西,我找不到真正的内存分配完成的代码(即malloc调用).
find . -exec grep -i "malloc" '{}' \; -print
Run Code Online (Sandbox Code Playgroud)
它只打印了一些malloc名字中包含单词的Lua宏.Lua VM(和编程语言)根本不使用malloc!
所以这引出了一个问题:现代虚拟机如何处理内存分配?Lua如何从堆中分配内存?除了以外有什么方法可以分配malloc吗?其他方法的优缺点是什么?
我也想知道安全地处理分配的内存的最佳实践,设计模式等.我在Lua的源代码中看到,在分配内存之前有很多间接.我在哪里可以了解这些东西?
我正在尝试解决编程竞赛的初步问题以及我必须计算的两个问题,并打印一些非常大的整数(如100!,2 ^ 100).
我还需要一种快速计算这个大整数的能力的方法.
你可以为我建议一些算法或数据结构吗?(顺便说一下,我读过C接口和实现的'任意精度算术'部分,但它对pow()没有帮助)
编辑:我认为通过平方法和位移的取幂对功率起作用,但我还需要一种快速的方法来计算这个因子的阶乘.谢谢.
EDIT2:对于那些感兴趣的人;
找到包含长度为N的所有位串的最短位串长度(对不起我的英文,我举一个例子).N <= 10000
例如,包括长度为2(00,01,10,11)的所有比特串的最短比特串长度是5(11001).
我对这个问题的解决方案是2 ^ n + n - 1.(所以我应该计算2的幂,我想我会使用位移)
其他问题是,给定2个长度,找到你可以通过多少种方式达到长度N.例如,输入是10,2,3.那么你应该用2和3达到10(例如,2 + 3) 2 + 2 + 2 + 2,2 + 2 + 3 + 3,3 + 2 + 2 + 3,3 + 3 + 2 + 2 ......).1 <= N <2 ^ 63.我们将在mod 1000000007中计算anwser.
我的解决方案是,2x + 3y = N,所以x =(N - 3y)/ 2.对于从0到2*N/3的y,如果x是一个整数,那么我应该计算这个X和Y的广义置换,总计+ =(x + y)!/(x!*y!).
我正在使用自己的玩具编程语言.现在我正在解释AST的源语言,我想知道编译一个字节码然后解释它有什么好处可以提供给我.
现在我有三件事:
我的观点是否正确?编译到字节码背后有什么其他动机?
我想在不使用任何克隆的情况下将旧变体的字段移动到新变体时更新枚举变体:
enum X {
X1(String),
X2(String),
}
fn increment_x(x: &mut X) {
*x = match *x {
X::X1(s) => X::X2(s),
X::X2(s) => X::X1(s),
}
}
Run Code Online (Sandbox Code Playgroud)
这并不工作,因为我们不能移动s的&mut X.
请不要建议实现enum X { X1, X2 }和使用struct S { variant: X, str: String }等等.这是一个简化的例子,想象在变体中有许多其他字段,并希望将一个字段从一个变量移动到另一个变体.
哈斯克尔network小号HostAddress说:"网络字节顺序",在它的文档
但是,如果我以网络字节顺序(big-endian)传递地址,它的show instance打印错误的地址:
Prelude Network.Socket> :m + Network.Socket Data.Bits
Prelude Network.Socket Data.Bits> SockAddrInet (fromInteger 50) (192 `shiftL` 24)
0.0.0.192:50
Prelude Network.Socket Data.Bits>
Run Code Online (Sandbox Code Playgroud)
这是预期的吗?为什么它会打印小端的东西?我应该以大端还是小端格式传递IP地址?
我正在尝试用parsec解析一些Text:
data Cmd = LoginCmd String
| JoinCmd String
| LeaveCmd String
deriving (Show)
singleparam :: Parser Cmd
singleparam = do
cmd <- choice [string "leave", string "login", string "join"]
spaces
nick <- many1 anyChar
eof
return $ LoginCmd nick
Run Code Online (Sandbox Code Playgroud)
我希望choice尝试匹配"离开",如果失败,则尝试"登录"等.但它只会尝试匹配"离开",如果失败,则会出错.
ghci> parseTest singleparam (pack "login asdf")
parse error at (line 1, column 1):
unexpected "o"
expecting "leave"
ghci> parseTest singleparam (pack "leave asdf")
LoginCmd "asdf"
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?