在ECMAScript 6中是否支持静态类型?ECMAScript 7怎么样?
我怎么能有多个类约束,所以如果A是Eq和B是Num,我可以说
f :: Eq a => a -> b`
Run Code Online (Sandbox Code Playgroud)
要么
f :: Num b => a -> b
Run Code Online (Sandbox Code Playgroud)
所以,我怎么能有Eq a =>和Num b =>在同一时间?
f :: Eq a => Num b => a -> b,f :: Eq a -> Num b => a -> b,和f :: Eq a, Num b => a -> b没做我想做的事.
我知道你可以创建一个匿名函数,让编译器推断它的返回类型:
val x = () => { System.currentTimeMillis }
Run Code Online (Sandbox Code Playgroud)
仅为了静态类型,是否可以指定其返回类型?我认为这会让事情变得更加清晰.
我知道这听起来像是对Lisp爱好者(以及其他动态语言爱好者)的亵渎,但是增强Clojure编译器以支持静态(编译时)类型检查有多难?
抛开支持和反对静态和动态类型的参数,这是否可行(不是"这是可行的")?
我想添加一个新的读取器宏来强制编译时类型(#^宏的增强版本)并将类型信息添加到符号表将允许编译器标记变量被滥用的位置.例如,在下面的代码中,我期望编译时错误(#*是"编译时"类型的宏):
(defn get-length [#*String s] (.length s))
(defn test-get-length [] (get-length 2.0))
Run Code Online (Sandbox Code Playgroud)
#^宏甚至可以与全局变量(*compile-time-type-checking*)一起重用,以强制编译器进行检查.
有关可行性的任何想法?
我已经玩了一段时间的Typscript了,我得说,捆绑了这样一个事实:nodejs比CPython的当前实现更快,因为我的web开发需求,我更倾向于用它来制作更多的东西.
事实上,我已经制作了几个基本的应用程序,甚至是桌面应用程序.我喜欢Typescript的事实是有可选的静态类型.这使得编码通常更容易,更不用说当你想快速编码并运行原型时,intellisense是惊人的.我在开发过程中遇到的错误也减少了.
但这就是问题所在,我已经使用Python一年了,我喜欢这种语言,而且我更习惯于语法.但是,越来越多,我看到可选的静态类型对于Python来说可能是一个很棒的加分点.所以,我做了一些研究,我首先开始尝试了解静态类型的情况.就像其他人一样,我用搜索引擎找出答案.
这些是我读过的一些信息来源:
如果你看一下这里的实现(摘自上面的链接):
from StringIO import StringIO
def foo(f: StringIO) -> str:
f.write("hello")
return f.getvalue()
f1 = StringIO("booh+")
print foo(f1) # prints "booh+hello"
Run Code Online (Sandbox Code Playgroud)
现在,这看起来与Typescript中的实现非常相似.但是,如果你看看日期,它会一直追溯到2004年.
然后,我又看了一眼Guido制作的BDFL幻灯片:
再一次,你看到同样的修辞.但是,我无法找到有关此问题的任何新信息.
所以,我想问一下,在Python中添加可选静态类型的情况或状态是什么?或者我们是否需要发明像Typescript这样的东西但是对于Python 3?
我认为可选的静态类型很重要,因为在我自己非常有限的经验中,我已经看到像Typescript和C#这样的东西工作得更好,因为在制作复杂的类或制作大型项目时,我已经看到静态类型已经很长时间了帮助我更快地编写代码和无错误的方法.我相信我并不像这里的大多数开发人员那么好,但这是我的看法.这就是为什么我觉得这个问题很重要.我的意思是如果你有一个像C#这样的语言的可选类型,并且Python提供了漂亮的语法,那么Python可能是不可阻挡的(耶!).
我已经对此做了一些研究,但我没有任何实质性的内容,所以我希望SO的一些非常聪明的成员能够阐明这个问题.
该Unit编译器生成的字节码的时候,因为它是类似于得到特殊的处理void在JVM上.但从概念上讲,作为scala类型系统中的一种类型,它似乎也在语言本身得到特殊处理(下面的例子).
所以我的问题是澄清这一点并理解使用的机制以及是否真的对该Unit类型进行了特殊处理.
例1:
对于"普通"scala类型Seq,如果方法返回Seq,则必须返回Seq(或更具体的类型Seq)
def foo1: Seq[Int] = List(1, 2, 3)
def foo2: Seq[Int] = Vector(1, 2, 3)
def foo3: Seq[Int] = "foo" // Fails
Run Code Online (Sandbox Code Playgroud)
前两个例子编译,因为List[Int]和Vector[Int]是的亚型Seq[Int].第三个失败,因为String不是.
但是,如果我改变了第三个例子返回Unit的是,它会编译并没有问题,运行,即便String 是没有的子类型Unit:
def foo3(): Unit = "foo" // Compiles (with a warning)
Run Code Online (Sandbox Code Playgroud)
我不知道在scala中允许此异常的任何其他类型.那么编译器Unit对类型系统级别的类型有特殊规则,或者是否存在某种更通用的机制,例如隐式转换.
例2:
我也不清楚单位如何在通常应用方差规则的情况下进行交互.
例如,我们有时会Future[Unit]在意外使用的地方遇到这个错误,map而不是flatMap创建一个 …
我已经阅读过像Scala或Haskell这样的静态类型语言,无法创建或提供Lisp apply函数:
(apply #'+ (list 1 2 3)) => 6
Run Code Online (Sandbox Code Playgroud)
或者可能
(apply #'list '(list :foo 1 2 "bar")) => (:FOO 1 2 "bar")
(apply #'nth (list 1 '(1 2 3))) => 2
Run Code Online (Sandbox Code Playgroud)
这是真的吗?
我曾经认为这个问题的答案是" 100% ",但我最近指出了一个让它值得思考的例子.考虑声明为具有自动存储持续时间的对象的C数组:
int main()
{
int foo[42] = { 0 };
}
Run Code Online (Sandbox Code Playgroud)
这里的类型foo很明显int[42].相反,请考虑以下情况:
int main()
{
int* foo = new int[rand() % 42];
delete[] foo;
}
Run Code Online (Sandbox Code Playgroud)
这里foo是is 的类型int*,但是如何在编译时告诉表达式创建new的对象的类型?(重点是强调我不是在谈论new表达式返回的指针,而是关于表达式创建的数组对象new).
这就是C++ 11标准的第5.3.4/1段规定了new表达式的结果:
[...]由new-expression创建的实体具有动态存储持续时间(3.7.4).[注意:此类实体的生命周期不一定限于创建它的范围.-end note]如果实体是非数组对象,则new-expression返回指向所创建对象的指针.如果它是一个数组,则new-expression 返回一个指向数组初始元素的指针.
我以前认为在C++中所有对象的类型都是在编译时确定的,但上面的例子似乎反驳了这种信念.另外,根据第1.8/1段:
[...] 创建对象时确定对象的属性.对象可以有一个名称(第3条).对象的存储持续时间(3.7)会影响其生命周期(3.8).对象具有类型(3.9).[...]
所以我的问题是:
如果有人能够至少详细说明上述一点,那就太好了.
编辑:
标准似乎清楚地表明new …
在阅读了Eli Bendersky 关于通过Python协同程序实现状态机的文章后,我想......
我成功完成了第一部分(但是没有使用async defs或yield froms,我基本上只是移植了代码 - 所以任何改进都是最受欢迎的).
但是我需要一些关于协同程序类型注释的帮助:
#!/usr/bin/env python3
from typing import Callable, Generator
def unwrap_protocol(header: int=0x61,
footer: int=0x62,
dle: int=0xAB,
after_dle_func: Callable[[int], int]=lambda x: x,
target: Generator=None) -> Generator:
""" Simplified protocol unwrapping co-routine."""
#
# Outer loop looking for a frame header
#
while True:
byte = (yield)
frame = [] # type: List[int]
if byte == header:
#
# Capture the full frame
# …Run Code Online (Sandbox Code Playgroud) 有什么方法可以在 Julia 中明确要求(例如在模块或包中)必须声明类型 ?例如或是否支持此类检查?更广泛地说,Julia 标准发行版本身是否提供任何可以帮助检查此要求的静态代码分析器或等效物? PackageCompilerLint.jl
作为一个激励示例,假设我们希望确保不断增长的生产代码库只接受始终声明为类型的代码,前提是具有类型声明的大型代码库往往更易于维护。
如果我们想强制执行该条件,Julia 在其标准发行版中是否提供任何机制来要求类型声明或帮助推进该目标?(例如,任何可以通过短绒、提交钩子或等价物检查的东西?)
static-typing ×10
scala ×3
haskell ×2
python ×2
c++ ×1
c++11 ×1
clojure ×1
compilation ×1
coroutine ×1
ecmascript-6 ×1
ecmascript-7 ×1
generator ×1
javascript ×1
julia ×1
lint ×1
lisp ×1
mypy ×1
python-3.x ×1
types ×1