小编sin*_*nan的帖子

使用列表推导仅仅是副作用是Pythonic吗?

想想我正在调用它的副作用的函数,而不是返回值(比如打印到屏幕,更新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)

哪个更好?为什么?

python list-comprehension

97
推荐指数
4
解决办法
8534
查看次数

Haskell的类型系统和逻辑编程 - 如何将Prolog程序移植到类型级别

我试图理解逻辑编程语言(在我的例子中是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)

haskell type-systems prolog logic-programming

25
推荐指数
2
解决办法
2450
查看次数

coqide - 无法从同一文件夹加载模块

我无法加载CoqIde中相同文件夹中的模块.

我试图从软件基金会加载来源,我跑在包含SF sources文件夹coqide coqidecoqide ./,然后打开并运行该文件后,我得到这个错误:

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?

coq

19
推荐指数
2
解决办法
8695
查看次数

java - 有收集异常的标准方法吗?

我有一个Java程序,可以解析几个不同的输入文件.即使在此输入文件中发现错误,解析仍可继续并收集其他几个错误.所以我想做的不是抛出异常并停止解析过程,我想将异常注册到某个地方,然后继续解析并以类似的方式收集其他几个错误,最后我想检查是否报告任何错误,并根据此情况失败或继续.

当然,我总是可以通过编写ExceptionRegister或任何类来手动执行此操作,但我想知道两件事:

1)这种方法有问题吗?你知道我想做什么的替代设计吗?

2)有这样做的标准方法吗?(例如,如果可能的话,我不想滚动我自己的类,我想使用内置功能)

谢谢

编辑:我不知道为什么但是在我接受他的答案之前,有人刚刚删除了他的答案.无论如何,我认为简单的数据结构应该有效.基本上,我将编写一个收集多个错误消息的异常类.然后我将调用它的throw方法,如果它至少注册了一条错误消息,则抛出该方法.

EDIT2:这里有更多的说明.我的问题与解析无关.解析只是一个例子,因为我的程序做了一些解析.想一想:我正在运行一个算法,如果出现错误,我可以继续算法收集更多错误,这样就不会打印出一个错误,当它被修复时,打印出第二个错误,我可以将这两个错误一起打印出来.

java exception-handling exception

19
推荐指数
1
解决办法
4200
查看次数

现代VM如何处理内存分配?

我正在研究用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的源代码中看到,在分配内存之前有很多间接.我在哪里可以了解这些东西?

c lua memory-management vm-implementation

16
推荐指数
2
解决办法
2412
查看次数

如何处理不适合任何语言数据结构的大整数

我正在尝试解决编程竞赛的初步问题以及我必须计算的两个问题,并打印一些非常大的整数(如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!).

c algorithm biginteger arbitrary-precision data-structures

14
推荐指数
2
解决办法
2775
查看次数

编译为字节码的动机是什么?

我正在使用自己的玩具编程语言.现在我正在解释AST的源语言,我想知道编译一个字节码然后解释它有什么好处可以提供给我.

现在我有三件事:

  • 遍历语法树数百次可能比运行阵列中的指令慢,特别是如果阵列支持O(1)随机访问(即上下跳过10条指令).
  • 在类型化的执行环境中,我有一些运行时成本,因为我输入了AST,并且我经常遍历它(即我有10种类型的节点,我需要检查我现在要执行的类型).也许编译成无类型的字节码可能有助于改善这一点,因为在类型检查和编译之后,我会有一个无类型的值和代码.
  • 编译为字节代码可以提供更好的可移植性.

我的观点是否正确?编译到字节码背后有什么其他动机?

interpreter bytecode abstract-syntax-tree

12
推荐指数
2
解决办法
8407
查看次数

在将字段移动到新变体时更改枚举变体

我想在不使用任何克隆的情况下将旧变体的字段移动到新变体时更新枚举变体:

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 }等等.这是一个简化的例子,想象在变体中有许多其他字段,并希望将一个字段从一个变量移动到另一个变体.

rust

12
推荐指数
2
解决办法
1686
查看次数

Haskell网络SockAddrInet使用哪个字节序?

哈斯克尔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地址?

ip haskell network-programming

10
推荐指数
1
解决办法
221
查看次数

Haskell Text.Parsec.Combinator选择不回溯

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

我究竟做错了什么?

haskell parsec

9
推荐指数
1
解决办法
1597
查看次数