我试图了解缺点在哪里.SML模块系统是否仅提供依赖类型,类似于Idris如何扩展Haskell类型系统,还是继续进行,而不仅仅是依赖类型的附加功能?有关现有互联网文章中SML模块系统的信息要么难以找到,要么难以理解.
**编辑**我对这个问题的看法有些困惑,混淆似乎源于我对ML模块系统的困惑(我认为是因为我理解了Haskell方式的Functors) ).提供依赖类型作为两种类型系统之间可能存在差异的一个例子,但事实证明它是一个不好的例子,因为两个系统都不支持这样的事情(至少不是直接).
这个问题的主要目标是让我确定ML和Haskell类型系统之间概念表达的差异.哪些抽象/概念不能用另一个抽象/概念表示?为什么有人会声称ML的类型系统比Haskell更现代/更强大,反之亦然.想到这一点的另一种方法是一种类型系统缺少哪一种不存在?
我有兴趣了解这一点的原因是我对构建软件系统感兴趣以及不同类型系统如何使软件的模块化和可扩展性变得更容易或更困难.我对命令式语言中的面向对象类型系统一直不感兴趣,因此我现在正在研究和研究ML和Haskell提供的那些系统,因为它们是我感兴趣的第一个.
我在Nix shell中进行开发(在我的项目根目录中创建一个default.nix文件,然后运行nix-shell .以给我一个可以访问项目依赖项的shell).
Spacemacs是我的主要编辑器,但当我尝试运行GUI版本时,emacs &我无法访问我的nix-shell中的程序(例如,如果我在Ruby on Rails项目中,并且Ruby被声明为依赖项)在我看来default.nix,我在Spacemacs中没有语法高亮,因为Emacs的GUI版本没有看到我的Nix-shell依赖项.如果我跑:!which ruby,它甚至找不到which命令.
现在,我正在运行spacemacs emacs -nw,只是从控制台使用它,但我真的希望能够使用GUI编辑器并获得完整的颜色方案,而不是局限于那些在256色模式下看起来不错的颜色方案.在终端和编辑器之间切换比在tmux窗格或终端拆分之间切换到我的CLI编辑器也更快.
with import <nixpkgs> {}; {
cannyFreeRadicalEnv = stdenv.mkDerivation rec {
name = "rails-project-env";
version = "0.1";
src = ./.;
buildInputs = [
stdenv
ruby_2_2_2
bundler
zlib
postgresql94
sqlite
zsh
git
nodejs-0_12
];
};
}
Run Code Online (Sandbox Code Playgroud) git status --porcelain如果您以编程方式解析当前的git分支状态,我会阅读其他各种SO帖子和Google搜索结果,这些结果并不是您想要依赖的命令.我终于指出rev-parse,diff-index和diff-files命令这样做-不过,我目前使用的方法是一个小马车,特别是在比主等分支机构.像oh-my-zsh这样的主题似乎正在使用git status --porcelain,我上面提到的并不是Git社区推荐的.那么阅读这些分支状态的正确方法是什么?
来自Bureau Oh-My-ZSH主题的代码段,以便清楚我正在尝试重现的行为.
bureau_git_status () {
_INDEX=$(command git status --porcelain -b 2> /dev/null)
_STATUS=""
if $(echo "$_INDEX" | grep '^[AMRD]. ' &> /dev/null); then
_STATUS="$_STATUS$ZSH_THEME_GIT_PROMPT_STAGED"
fi
if $(echo "$_INDEX" | grep '^.[MTD] ' &> /dev/null); then
_STATUS="$_STATUS$ZSH_THEME_GIT_PROMPT_UNSTAGED"
fi
if $(echo "$_INDEX" | command grep -E '^\?\? ' &> /dev/null); then
_STATUS="$_STATUS$ZSH_THEME_GIT_PROMPT_UNTRACKED"
fi
if $(echo "$_INDEX" | grep '^UU ' &> /dev/null); then
_STATUS="$_STATUS$ZSH_THEME_GIT_PROMPT_UNMERGED"
fi
if $(command git …Run Code Online (Sandbox Code Playgroud) 我在这里看一看:Scala currying与部分应用的函数,但那里的答案更多地回答了Scala中currying,partial application和normal函数之间的功能和语义差异.
我有兴趣了解这些可用于功能的不同技术之间是否有任何性能考虑因素,即......
如果我们使用普通函数的性能作为基础:
def add3(a: Int, b: Int, c: Int) = a + b + c
add3(1, 2, 3)
Run Code Online (Sandbox Code Playgroud)
然后比较:
// First
(add3 _).curried(1)(2)(3)
// Second
val add2 = add3(1, _: Int, _: Int)
val add1 = add2(2, _: Int)
add1(3)
// Third
def add3(a: Int)(b: Int)(c: Int) = a + b + c
add3(1)(2)(3)
Run Code Online (Sandbox Code Playgroud)
如果我发现一些性能不佳的代码(无论是在速度还是内存使用方面),我可能想要注意的是什么?我看到在所述代码段中发生了很多currying或部分应用程序?
例如,在Haskell中,我会查看正在生成多少个thunk并在其中闲逛.我认为Scala使用类似的方法来传递部分应用和curried函数,而Scala如何处理这些事情的细节将是很有价值的.
我在NixOS 15和nix-shell v1.10上.我现在使用Zsh作为我的主shell,并且当我在由Nix表达式构建的开发环境中工作时,想在nix-shell中与Oh-My-Zsh一起使用它.
如果它有帮助,这是我为Rails项目设置的Nix环境之一:
with import <nixpkgs> {}; {
cannyFreeRadicalEnv = stdenv.mkDerivation rec {
name = "canny-free-radical-env";
version = "0.1";
src = ./.;
buildInputs = [
stdenv
ruby_2_2_2
bundler_HEAD
zlib
postgresql94
sqlite
];
};
}
Run Code Online (Sandbox Code Playgroud)
**编辑**
以这种方式运行命令并不表示在CLI提示符中我在nix-shell中.有没有一种简单的方法可以检测到这一点,以便我可以在我的脚本中快速编写脚本zshrc?
我想要做的是创建一个API,将人类语音翻译成IPA(国际音标)格式.我的问题是,关于如何在原始音频波形的水平上解码语音的资源在哪里.我找了一个API,但我发现的大部分内容都直接翻译成罗马字母.我正在寻找能够区分声乐语音的能力.
我想做如下事情:
sinon.mock(obj)
.expects('func')
.atLeast(1)
.withArgs(args)
.returns(somePredefinedReturnValue);
Run Code Online (Sandbox Code Playgroud)
我期望所有内容都包括 withArgs,但随后我需要存根该方法的返回值,以便在它返回时不会中断被测方法中的其余执行流程。
我这样做的原因是因为我发现我的一些 REST 端点测试将在它们应该真正失败时默默地通过,如果没有调用内部有断言的带有回调的存根方法。我正在尝试验证这些回调实际上是否被调用,以便我的测试不会给出误报。
我构建类型的方式,我相信这将遵循Functor法则,该法律规定应该有一个身份函数,fmap返回原始函子.
码:
-- apply a style function to a shell prompt functor
-- e.g.
-- bold & fgColor red `style` gitCurrentBranch
style :: (String -> ShellPromptType -> String) -> ShellPromptSegment String
-> ShellPromptType -> ShellPromptSegment String
style f segment = \shType -> (flip f) shType <$> segment
-- this is fine
style' :: (String -> ShellPromptType -> String)
-> (ShellPromptType -> ShellPromptSegment String)
-> ShellPromptType -> ShellPromptSegment String
style' f makeSegment = flip f >>= \g shellType -> fmap g …Run Code Online (Sandbox Code Playgroud) 我有一个看起来像这样的数组:
mylist = [
"blah blah hello",
"\nbarnacles and stuff()",
"\nhello again",
"\nother stuff )"
]
Run Code Online (Sandbox Code Playgroud)
我的正则表达式如下:
s = 'hello'
rx = re.compile(s + '.*')
newlist = [ rx.sub(thing, '') for thing in mylist ]
Run Code Online (Sandbox Code Playgroud)
我期待新名单:
[
"blah blah",
"\nbarnacles and stuff()",
"\n",
"\nother stuff )"
]
Run Code Online (Sandbox Code Playgroud)
相反,我得到了:
[
"",
"",
"",
""
]
Run Code Online (Sandbox Code Playgroud)
这是怎么回事?这在REPL中的行为方式不同......
我有一个工作,从一个\n分隔流中读取数据,并将信息一次发送到xargs处理1行.问题是,这不够高效,但我知道如果我改变程序使得xargs执行的命令一次发送多行而不是一行,它可以大大提高我的脚本的性能.
有没有办法做到这一点?我没有任何运气与各种组合-L或-n.不幸的是,我认为我也坚持-I参数化输入,因为如果我不使用我的命令似乎不想采用标准输入-I.
基本的想法是我正在尝试使用xargs模拟小批量处理.
从概念上讲,这里有类似于我目前所写的内容
contiguous-stream | xargs -d '\n' -n 10 -L 10 -I {} bash -c 'process_line {}'
^在上面,process_line很容易改变,以便它可以同时处理多行,而这个功能现在是瓶颈.对于强调,以上,-n 10并且-L 10似乎没有做任何事情,我行仍在处理一次一个.
haskell ×3
shell ×2
arrows ×1
asynchronous ×1
audio ×1
bash ×1
benchmarking ×1
callback ×1
concurrency ×1
currying ×1
emacs ×1
functor ×1
git ×1
javascript ×1
module ×1
nix ×1
nixos ×1
node.js ×1
parsing ×1
performance ×1
python ×1
python-2.7 ×1
regex ×1
scala ×1
sinon ×1
sml ×1
substitution ×1
type-systems ×1
types ×1
xargs ×1