问题:不使用any,我的onMouseMove函数的正确类型是什么?
export class Main {
private dTimer: number;
constructor() {
this.init();
}
private init() {
this.mouseHandlers();
}
private mouseHandlers() {
document.addEventListener('mousemove', this.onMouseMove)
}
private onMouseMove: EventListener = (event: MouseEvent) => {
clearTimeout(this.dTimer);
this.dTimer = setTimeout(() => {
console.log(event.pageX, event.pageY)
}, 500);
}
}
Run Code Online (Sandbox Code Playgroud)
Typescript 抱怨我的类型,我不知道如何在不使用任何类型的情况下让它开心。
main.ts(38,3): error TS2322: Type '(event: MouseEvent) => void' is not assignable to type 'EventListener'.
Types of parameters 'event' and 'evt' are incompatible.
Type 'Event' is not assignable to type 'MouseEvent'. …Run Code Online (Sandbox Code Playgroud) 我已经读过Scala的类型推断不是全局的,所以人们必须在方法上放置类型注释.(这会是"本地"类型推断吗?)
我只是有点明白,原因在于它的面向对象性质,但清晰度使我无法理解.是否有"全局类型推断"的解释以及为什么Scala不能让初学者理解它?
使用float类型比使用double类型慢吗?
我听说现代的Intel和AMD CPU可以比使用浮点数更快地进行双倍计算.
什么标准的数学函数(sqrt,pow,log,sin,cos,等)?以单精度计算它们应该相当快,因为它应该需要更少的浮点运算.例如,单精度sqrt可以使用比双精度更简单的数学公式sqrt.另外,我听说标准数学函数在64位模式下更快(在64位操作系统上编译和运行时).对此有何明确答案?
通常声称RPython(Python的一个子集)是静态类型的.(例如在维基百科上.)
最初,我想知道他们如何将它添加到Python并认为他们可能已经添加了添加语句的要求,例如assert isinstance(arg1, ...)在每个函数的开头(但我真的不相信).
然后我查看了一些RPython代码,它看起来并没有真正的静态类型.在许多情况下,可能是编译器可以证明函数参数只能是某些类型,但绝对不是在所有情况下.
例如,这是RPython的实现string.split:
def split(value, by, maxsplit=-1):
bylen = len(by)
if bylen == 0:
raise ValueError("empty separator")
res = []
start = 0
while maxsplit != 0:
next = value.find(by, start)
if next < 0:
break
res.append(value[start:next])
start = next + bylen
maxsplit -= 1 # NB. if it's already < 0, it stays < 0
res.append(value[start:len(value)])
return res
Run Code Online (Sandbox Code Playgroud)
在关于RPython的PyPy文档中,有人说:" 变量应该包含最多一种类型的值 ".
那么,函数参数也算作变量吗?或者在什么意义上RPython静态输入?或者这实际上是错误的?
如果我理解正确Groovy是动态类型的,但由于它几乎是Java的超集,因此可以选择提供静态类型信息.如果只编写几个部分对性能至关重要的东西,同时避免使用多种语言的摩擦,这可能很有用.可以仅为性能关键部分提供类型注释.
在使用类似Java的子集和提供静态类型注释的函数/类中使用Groovy而不是Java的性能损失是什么?
谷歌这是一件难事,也许SO有更好的答案?
我来自静态类型的背景和调查函数式编程,但我对动态类型并不完全兴奋.好奇有什么样的选择.
一个答案开始:ActionScript 3是静态类型的,并提供一些功能范例,虽然AS3程序不经常使用它们.
types programming-languages functional-programming static-typing
我对静态类型语言没有多少经验(目前正在学习Scala并喜欢它!)但我注意到的一件事是它们似乎没有像Ruby的method_missing或ColdFusion的onMissingMethod那样的东西.静态类型语言是否存在一些固有的限制,可以防止或使其变得困难?
我想更清楚地了解关于他们的论证类型的闭包.所以我会写类似的东西
List<Y> myCollect(List<X> list, Closure<X,Y> clos) { ... }
Run Code Online (Sandbox Code Playgroud)
我知道Groovy不会使用该类型信息,但Groovy ++可能会在编译时使用它.这可以实现(除了将其纳入评论)?
更新:标题可能听起来有误导性,但我认为上面的例子会让它更清晰.我有兴趣指定一个闭包的类型,它是某个函数的参数.假设,我想重新启动内置功能collect.所以我对写作感兴趣myCollect,而不是写作clos.我想要实现的是获取编译时错误
myCollect(['a', 'ab'], { it / 2 }) // compile error
myCollect(['a', 'ab'], { it.size() }) // OK
Run Code Online (Sandbox Code Playgroud) 我正在研究一种新的编程语言的想法,理想情况下我希望这种语言能够混合一些功能和程序(面向对象)的概念.
我对Haskell这样的语言非常着迷的事情之一是它是静态类型的,但你不需要注释类型(魔术感谢Hindley-Milner!).
对于我的语言我真的很喜欢这个,但是在阅读了这个主题后,似乎大多数人认为类型推断对于子类型/面向对象是不切实际/不可能的,但是我不明白为什么会这样.我不知道F#,但我知道它使用Hindley-Milner并且是面向对象的.
我真的想要对此进行解释,并且最好是关于面向对象语言无法进行类型推断的场景的示例.
language-agnostic oop functional-programming type-inference static-typing
说实话,我不知道怎么说这个问题所以请原谅我,如果实际问题不是你所期望的基于标题.C#是我编写过的第一个静态类型的语言,到目前为止,它对我来说是一个绝对头疼的问题.我很确定我对于如何以静态类型的方式设计系统的核心思想没有很好的处理.
这是我想要做的一个粗略的想法.假设我有一个类的层次结构,如下所示:
abstract class DataMold<T>
{
public abstract T Result { get; }
}
class TextMold : DataMold<string>
{
public string Result => "ABC";
}
class NumberMold : DataMold<int>
{
public int Result => 123
}
Run Code Online (Sandbox Code Playgroud)
现在假设我想要列出项目列表,其中项目可以是任何类型的模具,我可以Result在foreach循环中获取每个项目的属性,如下所示:
List<DataMold<T>> molds = new List<DataMold<T>>();
molds.Add(new TextMold());
molds.Add(new NumberMold());
foreach (DataMold<T> mold in molds)
Console.WriteLine(mold.Result);
Run Code Online (Sandbox Code Playgroud)
正如您可能已经知道的那样,这不起作用.从我在搜索中看到的内容来看,它与我无法将List声明为类型这一事实有关DataMold<T>.这样做的正确方法是什么?
static-typing ×10
c# ×2
groovy ×2
groovy++ ×2
java ×2
oop ×2
scala ×2
c ×1
c++ ×1
closures ×1
coldfusion ×1
generics ×1
mouseevent ×1
mousemove ×1
performance ×1
pypy ×1
python ×1
rpython ×1
ruby ×1
tsc ×1
types ×1
typescript ×1