【发布时间】:2016-11-01 04:26:43
【问题描述】:
我正在编写一个神经网络,并且有以下节点的定义:
(defrecord Node [^double input-sum ^double last-output])
input-sum 是其输入的运行总和;预激活。 last-output 是激活值吗。
我最初的想法是创建一个像(->Node 0 nil) 这样的初始节点。我的理由是在last-output 被激活之前给它一个真正的价值是没有任何意义的。
不幸的是,创建上述节点会产生 NPE;显然是因为它试图将 nil 转换为双精度:
(->Node 0 nil)
NullPointerException clojure.lang.RT.doubleCast (RT.java:1298)
如果我删除 last-output 上的类型提示,它可以正常工作。
我正在努力养成在我能做的情况下输入提示的习惯。有没有办法在last-output 上提供类型提示,但也表明nil 是一个可接受的值?
【问题讨论】:
-
您能否更详细地解释一下您为什么“试图养成类型提示的习惯”?这样做是一种过早的优化,我相信你已经听过很多次了,它是万恶之源。
-
@SamEstep 我认为从一开始就定义类型而不是继续下去会更容易
-
但你不知道你是否真的需要在路上做。正如reference documentation 所述,类型提示纯粹是针对“性能关键代码区域”的性能优化,因此您所做的是过早优化的教科书示例。我强烈建议您阅读these three questions 的答案(如果您还没有的话)。
-
@SamEstep 好的,谢谢。也许我会启用反射警告并处理它,然后查看提到的包以获取文档。
-
在你已经写好你的代码,对它进行基准测试,发现反射是一个瓶颈之后,添加类型提示并没有什么问题。问题是当您在知道需要它们之前就使用它们来妨碍您的设计。至于文档,我个人推荐
clojure.spec;它在标准库中,因此它将成为未来最受支持的选项,并且它具有非常可靠的设计和许多非常棒的功能。
标签: clojure nullable type-hinting