标签: static-typing

27
推荐指数
2
解决办法
1万
查看次数

具有多个类约束的Haskell类型签名

我怎么能有多个类约束,所以如果AEqBNum,我可以说

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

没做我想做的事.

haskell types static-typing type-signature

26
推荐指数
1
解决办法
1万
查看次数

是否可以在Scala中指定匿名函数的返回类型?

我知道你可以创建一个匿名函数,让编译器推断它的返回类型:

val x = () => { System.currentTimeMillis }
Run Code Online (Sandbox Code Playgroud)

仅为了静态类型,是否可以指定其返回类型?我认为这会让事情变得更加清晰.

scala static-typing anonymous-function

23
推荐指数
3
解决办法
1万
查看次数

Clojure静态打字

我知道这听起来像是对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*)一起重用,以强制编译器进行检查.

有关可行性的任何想法?

static-typing clojure

23
推荐指数
3
解决办法
5888
查看次数

Python中可选静态类型的状态?

我已经玩了一段时间的Typscript了,我得说,捆绑了这样一个事实:nodejs比CPython的当前实现更快,因为我的web开发需求,我更倾向于用它来制作更多的东西.

事实上,我已经制作了几个基本的应用程序,甚至是桌面应用程序.我喜欢Typescript的事实是有可选的静态类型.这使得编码通常更容易,更不用说当你想快速编码并运行原型时,intellisense是惊人的.我在开发过程中遇到的错误也减少了.

但这就是问题所在,我已经使用Python一年了,我喜欢这种语言,而且我更习惯于语法.但是,越来越多,我看到可选的静态类型对于Python来说可能是一个很棒的加分点.所以,我做了一些研究,我首先开始尝试了解静态类型的情况.就像其他人一样,我用搜索引擎找出答案.

这些是我读过的一些信息来源:

  1. 在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幻灯片:

  1. 为什么添加静态打字?

再一次,你看到同样的修辞.但是,我无法找到有关此问题的任何新信息.

我也看了一下这个关于强制静态类型的答案.

所以,我想问一下,在Python中添加可选静态类型的情况或状态是什么?或者我们是否需要发明像Typescript这样的东西但是对于Python 3?

我认为可选的静态类型很重要,因为在我自己非常有限的经验中,我已经看到像Typescript和C#这样的东西工作得更好,因为在制作复杂的类或制作大型项目时,我已经看到静态类型已经很长时间了帮助我更快地编写代码和无错误的方法.我相信我并不像这里的大多数开发人员那么好,但这是我的看法.这就是为什么我觉得这个问题很重要.我的意思是如果你有一个像C#这样的语言的可选类型,并且Python提供了漂亮的语法,那么Python可能是不可阻挡的(耶!).

我已经对此做了一些研究,但我没有任何实质性的内容,所以我希望SO的一些非常聪明的成员能够阐明这个问题.

python static-typing python-3.x

22
推荐指数
1
解决办法
2245
查看次数

scala编译器对类型系统中的单元类型有什么特殊规则

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创建一个 …

functional-programming scala static-typing

22
推荐指数
3
解决办法
1076
查看次数

无法使用静态语言创建应用功能?

我已经阅读过像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)

这是真的吗?

lisp haskell programming-languages scala static-typing

21
推荐指数
3
解决办法
1407
查看次数

C++在多大程度上是一种静态类型的语言?

我曾经认为这个问题的答案是" 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).[...]

所以我的问题是:

  1. 最后引用的段落中的" 属性 " 是什么意思?显然,对象的名称不能算作" 在创建对象时"确定的东西- 除非" 创建 "在这里意味着与我想的不同;
  2. 是否有其他类型仅在运行时确定类型的对象示例?
  3. 在多大程度上说C++是一种静态类型的语言是正确的?或者更确切地说,在这方面对C++进行分类的最恰当方式是什么?

如果有人能够至少详细说明上述一点,那就太好了.

编辑:

标准似乎清楚地表明new …

c++ static-typing dynamic-typing language-lawyer c++11

21
推荐指数
2
解决办法
2703
查看次数

具有yield的Python函数的正确类型注释

在阅读了Eli Bendersky 关于通过Python协同程序实现状态机的文章后,我想......

  • 看他在Python3下运行的例子
  • 并为生成器添加适当的类型注释

我成功完成了第一部分(但是没有使用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)

python static-typing generator coroutine mypy

21
推荐指数
3
解决办法
4491
查看次数

在 Julia 中要求类型声明

有什么方法可以在 Julia 中明确要求(例如在模块或包中)必须声明类型 ?例如或是否支持此类检查?更广泛地说,Julia 标准发行版本身是否提供任何可以帮助检查此要求的静态代码分析器或等效物? PackageCompilerLint.jl

作为一个激励示例,假设我们希望确保不断增长的生产代码库只接受始终声明类型的代码,前提是具有类型声明的大型代码库往往更易于维护。

如果我们想强制执行该条件,Julia 在其标准发行版中是否提供任何机制来要求类型声明或帮助推进该目标?(例如,任何可以通过短绒、提交钩子或等价物检查的东西?)

lint compilation static-typing dynamic-typing julia

18
推荐指数
2
解决办法
607
查看次数