我想做某事.像这样:
foo=(a b c)
foo-=b
echo $foo # should output "a c"
Run Code Online (Sandbox Code Playgroud)
如何从数组中删除条目?foo-=b不起作用.
无论条目在何处,删除都应该有效.
我一直认为Haskell会做一些自动智能记忆.例如,天真的斐波那契实施
fib 0 = 0
fib 1 = 1
fib n = fib (n-2) + fib (n-1)
Run Code Online (Sandbox Code Playgroud)
因此会很快.现在我读了这个,似乎我错了--Haskell似乎没有做自动记忆.或者我理解错了什么?
还有其他语言可以自动(即隐式,非显式)进行记忆吗?
实施备忘录的常用方法有哪些?在我看到的所有示例实现中,它们都使用了散列映射,但其大小没有任何限制.显然,这在实践中不起作用,因为你需要某种限制.鉴于此,它变得更加复杂,因为当你达到极限时,你必须扔掉一些数据.并且它变得复杂:如果限制可能是动态的并且经常使用的功能应该比不常使用的功能具有更高的限制吗?当你达到极限时,你扔掉了什么条目?只是最新使用的一个?在这种情况下,您还需要对数据进行排序.您可以使用链接列表和哈希映射的某种组合来实现这一点.这是常见的方式吗?
你可以链接(或参考)一些常见的实际实现吗?
谢谢,艾伯特
编辑:我最感兴趣的是我描述的问题,即如何实现这样的限制.对任何解决这个问题的论文的任何引用都会非常好.
编辑:可以在此处找到一些示例实现(具有限制)的想法.
编辑:我不是试图解决特定应用程序中的特定问题.我正在寻找用于memoization的通用解决方案,它可以全局应用于(纯功能)程序的所有功能(因此不实现内存限制的算法不是解决方案).当然,(可能)没有最佳/最佳解决方案.但这使我的问题不那么有趣.
为了尝试这样的解决方案,我考虑将其添加到Haskell作为优化.我真的很想知道这会有多好.
我想知道是否有人已经这样做了.
我只是查看Set界面,发现它主要(或完全)只重新声明已经在Collection界面中的功能.Set本身扩展Collection,所以这是不是意味着Set界面自动具有所有功能Collection?那么他们为什么要重新申报呢?
例如,Set重新声明:
/**
* Returns the number of elements in this set (its cardinality). If this
* set contains more than <tt>Integer.MAX_VALUE</tt> elements, returns
* <tt>Integer.MAX_VALUE</tt>.
*
* @return the number of elements in this set (its cardinality)
*/
int size();
/**
* Returns <tt>true</tt> if this set contains no elements.
*
* @return <tt>true</tt> if this set contains no elements
*/
boolean isEmpty();
Run Code Online (Sandbox Code Playgroud)
并在以下声明Collection …
如果你看一下从模块编译的Python字节码,你会在最后看到:
10 LOAD_CONST 0 (None)
13 RETURN_VALUE
Run Code Online (Sandbox Code Playgroud)
即,a return在模块的根级别上完全有效.但是,如果您尝试在源代码中使用它,您会得到:
SyntaxError: 'return' outside function
Run Code Online (Sandbox Code Playgroud)
为什么?
这当然是语言设计的决定.但为什么要这样做?A return在模块中通常非常有用.例如,我有时想在模块的开头编写这段代码:
import sys
if sys.platform != "linux2":
print "your platform is not yet supported"
# define some stubs
def foo(): pass
def bar(): pass
return
Run Code Online (Sandbox Code Playgroud)
而且我不想在那里引发异常(因为这会导致模块无法加载我不想要的).
实际上,我将一些代码组合在一起,可以动态操作Python字节码并只返回(或者在我的情况下跳转到返回完成的末尾).这有效.它只是CPython的唯一原因是因为没有标准的方法来操作代码对象.
这是代码.
对于可能的答案:我更喜欢真实的证据,Guido van Rossum的一些过去的陈述,或者更喜欢这个,而不是任何随机的讨论.我当然可以利用这两种优势(如已经提出的那样)和我自己的缺点,但我并没有真正看到反对它的重要原因.
这是一个理论问题,所以期望这里的许多细节在实践中甚至在理论上都是不可计算的.
假设我有一个s我要压缩的字符串.结果应该是一个自解压二进制文件(可以是x86汇编程序,但它也可以是其他一些假设的图灵完全低级语言)输出s.
现在,我们可以轻松地遍历所有可能的二进制文件和程序,按大小排序.让我们B_s输出这些二进制文件的子列表s(当然B_s是不可计算的).
由于每一个正整数的集合必须有一个最低限度,必须有一个最小的程序b_min_s在B_s.
对于什么语言(即字符串集)我们知道的大小b_min_s?也许只是估计.(我可以构建一些简单的例子,我可以随时计算,但我B_s也b_min_s对更有趣的语言感兴趣.)
在Windows中,可以通过此代码设置线程名称.然后,线程名将显示在调试器中.
在MacOSX中,我看到了几个提示,表明有线程名称.我认为NSThread类也有一个名称属性.我的目标是我可以在我的C++应用程序中设置threadname并在Xcode/gdb中查看它.
其他相关问题:
关于tf.contrib.data.Dataset(来自TensorFlow 1.2,请参见此处和此处)用法:如何获取数据的方式并不真正适合我通常如何获取数据.在我的情况下,我有一个线程,我在那里收到数据,我不知道它什么时候会结束但我看到它何时结束.然后我等到我处理完所有的缓冲区,然后我完成了一个纪元.我怎样才能得到这个逻辑Dataset?
请注意,我更喜欢Dataset接口而不是QueueBase接口,因为它为我提供了迭代器接口,我可以重新初始化,甚至重置为不同的接口Dataset.与在关闭后无法重新打开的队列相比,这更加强大(请参阅此处和此处).
也许是一个类似的问题,或者同样的问题:我如何绕过Dataset一个队列?我有一些线程从某处读取一些数据,可以提供它并以某种方式排队.如何将数据输入Dataset?我可以无限次重复一些虚拟张量然后map用来返回我的queue.dequeue()但是这真的只能让我回到队列的所有原始问题,即如何重新打开队列.
我没有在Python中找到一种标准的方式来读取图像.真的没有(因为有这么多自定义内容的函数,我真的很想知道没有读取图像的功能)?或者它是什么?(它应该在MacOSX标准安装和Linux发行版的最新版本中提供.)
如果没有,最常见的lib是什么?
许多搜索结果都提示我使用Python Imaging Library.如果这是一个众所周知的Python-lib用于读取图像,为什么它不包含在Python中?
我想知道从程序员的角度来看,字符串类型是不可变的好处.
技术优势(在编译器/语言方面)可以概括为,如果类型是不可变的,则更容易进行优化.请阅读此处了解相关问题.
另外,在一个可变的字符串类型中,要么你已经内置了线程安全(然后再次,优化更难),或者你必须自己做.在任何情况下,您都可以选择使用具有内置线程安全性的可变字符串类型,因此这不是不可变字符串类型的优势.(同样,更容易进行处理和优化以确保不可变类型的线程安全,但这不是重点.)
但是不可变字符串类型在使用中有什么好处?让某些类型不可变而其他类型不可变的重点是什么?这对我来说似乎很不一致.
在C++中,如果我想要一些字符串是不可变的,我将它作为const引用传递给function(const std::string&).如果我想要一个原始字符串的可更改副本,我将其作为传递std::string.只有当我想让它变得可变时,我才将它作为reference(std::string&)传递.所以我只能选择我想做的事情.我可以用各种可能的类型做到这一点.
在Python或Java中,某些类型是不可变的(大多数都是基本类型和字符串),而其他类型则不是.
在像Haskell这样的纯函数式语言中,一切都是不可变的.
是否有充分理由说明这种不一致是否有意义?或者仅仅是出于技术上的低级原因?
python ×3
c++ ×2
java ×2
arrays ×1
collections ×1
compression ×1
gdb ×1
haskell ×1
image ×1
immutability ×1
interface ×1
memoization ×1
module ×1
png ×1
qt ×1
return ×1
set ×1
shell ×1
string ×1
tensorflow ×1
xcode ×1
zsh ×1