在许多符号数学系统中,例如Matlab或Mathematica,您可以使用类似的变量Ans
或%
检索最后计算的值.Python shell中是否有类似的工具?
众所周知,Haskell风格的类型类和ML风格的模块提供了不同的指定接口的机制.它们(可能)具有相同的功率,但实际上每种都有其自身的优点和缺点.
由于我在语言功能方面有点像包容性,我的问题是:在Haskell中添加ML样式模块有哪些主要的理论上的困难?我对以下几行的答案感兴趣:
现有的类型系统功能与ML型模块的交互性很差?(不良交互的一个例子是GADT和功能依赖,即使fundeps在技术上等同于相关类型!)
为了编译ML样式的模块,必须在编译器端放弃什么?
ML样式模块如何与类型推断交互?
相关阅读:
GCC编译器支持__builtin_expect语句,该语句用于定义可能的和不太可能的宏.
例如.
#define likely(expr) (__builtin_expect(!!(expr), 1))
#define unlikely(expr) (__builtin_expect(!!(expr), 0))
Run Code Online (Sandbox Code Playgroud)
是否有Microsoft Visual C编译器的等效声明,或等效的东西?
compiler-construction optimization gcc visual-studio likely-unlikely
有效的XML字符列表是众所周知的,如规范所定义:
#x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]
Run Code Online (Sandbox Code Playgroud)
我的问题是,通过使用Unicode常规类别,是否可以为此(或其反向)制作PCRE正则表达式而不实际对代码点进行硬编码.反向可能类似于[\ p {Cc}\p {Cs}\p {Cn}],除了不正确地覆盖换行符和制表符并错过其他一些无效字符.
默认情况下,当我使用NPM管理包依赖于foo和bar时,两者都依赖于corelib,默认情况下,NPM将安装corelib两次(一次用于foo,一次用于bar).它们甚至可能是不同的版本.
现在,让我们假设corelib定义了一些在foo,bar和主应用程序之间传递的数据结构(例如URL对象).现在,我期望的是,如果这个对象有一个向后不兼容的变化(例如,其中一个字段名称发生了变化),而foo依赖于corelib-1.0而bar依赖于corelib-2.0,我会非常悲伤的熊猫:吧的corelib-2.0版本可能会看到旧版本的corelib-1.0创建的数据结构,但事情不会很好.
我真的很惊讶地发现这种情况基本上没有发生过(我搜索了谷歌,Stack Overflow等,寻找那些应用已经停止工作但可以通过运行重复数据删除修复它的人的例子.)所以我的问题是,为什么是这样的吗?是因为node.js库从不定义在程序员之外共享的数据结构?是因为node.js开发人员从不破坏其数据结构的向后兼容性?我真的很想知道!
作为一名程序员,我全心全意地购买了TDD理念,并努力为我编写的任何重要代码进行广泛的单元测试.有时这条道路可能会很痛苦(行为变化会导致多个单元测试的级联变化;需要大量的脚手架),但总的来说,我拒绝编程而没有我可以在每次更改后运行的测试,而且我的代码就像结果.
最近,我一直在玩Haskell,它是常驻测试库,QuickCheck.与TDD明显不同的是,QuickCheck强调测试代码的不变量,即保留输入的所有(或实质子集)的某些属性.一个简单的例子:一个稳定的排序算法应该给出相同的答案,如果我们运行它两次,应该有增加的输出,应该是输入的排列等.然后,QuickCheck生成各种随机数据,以测试这些不变量.
在我看来,至少对于纯函数(即没有副作用的函数 - 如果你正确地模拟你可以将脏函数转换成纯函数),那些不变测试可以取代单元测试作为这些函数的严格超集. .每个单元测试由输入和输出组成(在命令式编程语言中,"输出"不仅仅是函数的返回,而且还有任何已更改的状态,但这可以被封装).可以想象,可以创建一个随机输入生成器,它足以覆盖您手动创建的所有单元测试输入(然后是一些,因为它会产生您根本不会想到的情况); 如果由于某些边界条件而在程序中发现错误,则可以改进随机输入生成器,以便生成该情况.
那么,挑战在于是否有可能为每个问题制定有用的不变量.我要说的是:一旦你有一个答案,看它是否正确,首先计算答案就更简单了.对不变量的思考也有助于澄清复杂算法的规范,比特殊测试用例更好,这鼓励了对问题的逐个案例思考.您可以将程序的先前版本用作模型实现,或者使用另一种语言的程序版本.等等.最终,您可以覆盖所有以前的测试用例,而无需显式编码输入或输出.
我疯了,还是我做某事?
这里有一些值得思考的东西.
当我编写monadic代码时,monad会对完成的操作进行排序.例如,如果我写入IO monad:
do a <- doSomething
b <- doSomethingElse
return (a + b)
Run Code Online (Sandbox Code Playgroud)
我知道doSomething
以前会被执行doSomethingElse
.
现在,考虑像C这样的语言中的等效代码:
return (doSomething() + doSomethingElse());
Run Code Online (Sandbox Code Playgroud)
C的语义实际上没有指定这两个函数调用将被评估的顺序,因此编译器可以随意移动它.
我的问题是这样的:我如何在Haskell中编写monadic代码,这也使得这个评估顺序未定义?理想情况下,当编译器的优化器查看代码并开始移动时,我会获得一些好处.
以下是一些可能无法完成工作的技术,但却是正确的"精神":
plus doSomething doSomethingElse
并plus
调度monadic调用.缺点:你失去了对monadic动作结果的分享,并且plus
仍然决定什么时候最终会被评估.unsafeInterleaveIO
调度推迟到评估的懒惰需求.但懒惰不同于严格的未定义顺序:特别是我确实希望我的所有monadic动作都被执行.seq
不强加排序约束.从这个意义上讲,我想要一些比一元顺序更灵活的东西,但是比完全懒惰更不灵活.
我想以编程方式通过JavaScript或浏览器中的其他API来确定页面的编码.我想要这些信息的原因是因为我试图模仿主要浏览器他们支持的字符编码,显然只是因为我发送了相应的"Content-Type"并不意味着浏览器会使用编码做正确的事情.任何其他可能的方法都是受欢迎的,但我不想点击"页面信息"进行50多个字符编码.
下面是一个简单的Haskell程序,它计算树上的等式:
import Control.Monad
import Control.Applicative
import Data.Maybe
data Tree = Leaf | Node Tree Tree
eqTree :: Tree -> Tree -> Maybe ()
eqTree Leaf Leaf = return ()
eqTree (Node l1 r1) (Node l2 r2) = eqTree l1 l2 >> eqTree r1 r2
eqTree _ _ = empty
Run Code Online (Sandbox Code Playgroud)
假设您有一个树的关联列表[(Tree, a)]
,并且您想要找到给定树的条目.(人们可以将其视为类型类实例查找问题的简化版本.)天真地,我们必须做O(n*s)工作,其中n是树的数量,s是每棵树的大小.
如果我们使用trie地图来表示我们的关联列表,我们可以做得更好:
(>.>) = flip (.)
data TreeMap a
= TreeMap {
tm_leaf :: Maybe a,
tm_node :: TreeMap (TreeMap a)
}
lookupTreeMap :: Tree -> TreeMap a …
Run Code Online (Sandbox Code Playgroud) 我几个小时前刚刚下载了Eclipse,需要将Java3D添加到类路径中.安装它没有任何障碍,但Eclipse似乎无法找到文档文件夹,因此它可以提供超级IDE功能,例如自动完成和方法签名.
虽然我知道如何单独添加它们,但这引出了我的问题; 在Eclipse中安装Java库的"正确"方法是什么?我应该遵循特殊的目录格式吗?是否有插件已经为我做了这个?(答案是肯定的,但我不知道如何使用它,或者它是否合适).
谢谢!
编辑1:在我看来,有人对这个问题进行了投票.我可以问为什么?
编辑2:因此,在使用JAR进行调整之后,似乎手动设置库中每个JAR的文档路径似乎是最不容易出错的方式.
haskell ×3
eclipse ×1
encoding ×1
gcc ×1
java ×1
javascript ×1
ml ×1
monads ×1
node.js ×1
npm ×1
ocaml ×1
optimization ×1
pcre ×1
python ×1
quickcheck ×1
regex ×1
sml ×1
type-systems ×1
unicode ×1
unit-testing ×1