簡體   English   中英

可空雙型提示

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM