为什么Clojure无法推断出这种def类型?

时间:2017-01-14 20:58:40

标签: clojure type-inference cursive

我正在编写客户端/服务器测试,并遇到了意想不到的事情。在以下代码中,Socket构造函数的port参数无法推断:

(ns second-try.test.client
  (:import [java.net Socket]))

(def port 5555)

(defn -main []
  ; "Cannot disambiguate overloads of Socket"
  (let [sock (Socket. "127.0.0.1" port)]))

第一个参数的类型应该是显而易见的,因为我传递了一个文字。我认为端口的类型再次显而易见,它只是一个文字;虽然隐藏在def后面。

但出于某种原因,它无法确定port的类型。我可以通过在def上或在参数前面添加注释来解决它,但为什么这是必要的?不应该明白它的类型是什么?

2 个答案:

答案 0 :(得分:3)

在Clojure中推断存储在var中的值的类型是不可能的,因为var可以随时重新定义。

但是,Clojure在运行时确定类型不应该有任何问题,虽然它需要使用反射来在运行时消除歧义,但是有问题的代码应该(并且确实)运行。

该错误似乎与草书有关:https://stackoverflow.com/a/32473508/440294

  

添加一个类型提示...以指定您希望使用哪个重载将消除对反射的需要,并希望平息Cursive。

在你的情况下,我会尝试类似的事情:

attr()

答案 1 :(得分:2)

在这种情况下,只需将var声明为:const

(def ^:const port 5555)

(defn -main []
  (let [sock (Socket. "127.0.0.1"  port)]))