[英]Nullable Double Type-Hint
我正在編寫一個神經網絡,並具有以下節點定義:
(defrecord Node [^double input-sum ^double last-output])
input-sum
是其input-sum
; 預激活。 last-output
是它的激活值。
我最初的想法是創建一個初始節點,例如(->Node 0 nil)
。 我的理由是,在last-output
被激活之前給它一個真實的值沒有任何意義。
不幸的是,創建上述節點會產生一個NPE。 顯然是因為它試圖將nil
為double:
(->Node 0 nil)
NullPointerException clojure.lang.RT.doubleCast (RT.java:1298)
如果我刪除last-output
上的type-hint,它將正常工作。
我正在嘗試養成我能做到的提示類型的習慣。 有沒有一種方法可以在last-output
上提供類型提示,還可以指示nil
是可接受的值?
如果您確實需要使用原始類型來鍵入提示,並且不建議使用對象類型Double
(出於與性能相關的原因,例如),就我所知,通常的做法是創建自己的自定義構造函數:
user> (defrecord Node [^double input-sum ^double last-output])
user.Node
user> (defn make-node [^Double input-sum ^Double last-output]
(->Node (or input-sum 0) (or last-output 0)))
#'user/make-node
user> (make-node nil 0)
#user.Node{:input-sum 0.0, :last-output 0.0}
user> (make-node 10 nil)
#user.Node{:input-sum 10.0, :last-output 0.0}
user> (make-node 1 2)
#user.Node{:input-sum 1.0, :last-output 2.0}
該方法適用於所有情況,在這些情況下您需要一些復雜的邏輯來進行實體構造。
更新
如果你真的需要這兩個原始值,並區分“沒有價值”價值的方式,你可以使用NaN
為:
user> (defn make-node [^Double input-sum ^Double last-output]
(->Node (or input-sum Double/NaN) (or last-output Double/NaN)))
#'user/make-node
user> (make-node 1 nil)
#user.Node{:input-sum 1.0, :last-output NaN}
因此,它是值,也是nil
的原始類似物。
^double
是Java原始double類型的類型提示。 嘗試^Double
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.