Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure类型转换不';不可能发生_Clojure_Floating_Coercion - Fatal编程技术网

Clojure类型转换不';不可能发生

Clojure类型转换不';不可能发生,clojure,floating,coercion,Clojure,Floating,Coercion,我有以下函数,它为我提供了一个哈希映射: (build-quarter-note-group 60) ;;=> {0.0 "c'", 2.0 "cisis'", -2.0 "ceses'", 0.5 "cih'", -0.5 "ceh'", 1.0 "cis'", -1.0 "ces'", 1.5 "cisih'", -1.5 "ceseh'"} 然后,我通过在另一个函数中对映射中的键进行geting来获取值 (defn keynum->name ([keynum] (->

我有以下函数,它为我提供了一个哈希映射:

(build-quarter-note-group 60)
;;=> {0.0 "c'", 2.0 "cisis'", -2.0 "ceses'", 0.5 "cih'", -0.5 "ceh'", 1.0 "cis'", -1.0 "ces'", 1.5 "cisih'", -1.5 "ceseh'"}
然后,我通过在另一个函数中对映射中的键进行
get
ing来获取值

(defn keynum->name
  ([keynum] (->> 0.0 (get (build-quarter-note-group keynum))))
  ([keynum transposition] (->> (float transposition) (get (build-quarter-note-group keynum)))))
由于键都是
keynum->name
函数中的浮点数,因此我尝试执行类型强制,但发生了以下情况:

(keynum->name 60 1) ;;=> nil
(get (build-quarter-note-group 60) (float 1)) ;;=> nil

(浮点1)
的结果会发生什么变化

引用给以下人员的答案:

我认为,在最多有8个键的映射中查找浮点值是实现的一个意外

对于较大的映射和哈希集,它失败的原因是(double 1.0)和(float 1.0)的哈希值不同

示例中的所有值(如1.0和其他值)默认为键入double。请注意,如果强制贴图的关键点为浮动,则即使贴图有8个以上的关键点,查找也会成功:

user=> (get {(float 1.0) "a" 2.0 "b" 3.0 "c" 4.0 "d" 5.0 "e" 6.0 "f" 7.0 "g" 8.0 "h" 1 "i"} (float 1)) 
"a"
我的猜测是,除了使用一个小地图碰巧返回一个成功查找的意外情况外,这里的一切都按设计工作

我认为,使用小映射进行get确实可以找到查找匹配项(float 1)的原因可能是因为小映射的实现是作为ArrayMap的,在ArrayMap中,使用clojure.core/=(或其Java等效项)按顺序将查找键与数组中的所有键进行比较,并且:

简而言之,地图中的关键点是双倍的,而不是浮动的


(获取(生成四分音符组60)(双1))
=>
“cis”

我无法重现您的问题:(获取{1.0“cis”}(浮点1))=>“cis”。imho(构建四分之一音符组60)为零这很奇怪。我只能在地图有超过8个值时重现你的问题<代码>(获取{1.0“a”2.0“b”3.0“c”4.0“d”5.0“e”6.0“f”7.0“g”8.0“h”)(浮点1.0))
a
,但
(获取{1.0“a”2.0“b”3.0“c”4.0“d”5.0“e”6.0“f”7.0“g”8.0“h”9.0“i”>(浮点1.0))
jinire发行的《日立法典:
user=> (get {(float 1.0) "a" 2.0 "b" 3.0 "c" 4.0 "d" 5.0 "e" 6.0 "f" 7.0 "g" 8.0 "h" 1 "i"} (float 1)) 
"a"
user=> (= (float 1) (double 1))
true