基于Clojure中参数类型的规范化返回方法

基于Clojure中参数类型的规范化返回方法,clojure,Clojure,如果参数是符号,则返回它。如果参数是列表,请调用另一个方法 Clojure新手,无法找到规范的方法。在Python中,可以执行以下操作: def返回参数类型(参数): 如果类型(arg)为str: 返回参数 如果类型(arg)为列表: 返回另一个_方法(arg) 可能我可以使用多种方法,但如何匹配参数的类型,以及在Clojure中匹配类型是否可以接受?不确定目标,但这应该是可行的: (defn something [arg] (cond (str? arg) arg (l

如果参数是符号,则返回它。如果参数是列表,请调用另一个方法

Clojure新手,无法找到规范的方法。在Python中,可以执行以下操作:

def返回参数类型(参数):
如果类型(arg)为str:
返回参数
如果类型(arg)为列表:
返回另一个_方法(arg)

可能我可以使用多种方法,但如何匹配参数的类型,以及在Clojure中匹配类型是否可以接受?

不确定目标,但这应该是可行的:

(defn something [arg]
  (cond
    (str? arg)  arg
    (list? arg) (other-fn arg)))

可以在Clojure中检查类型。它不是一种非类型语言

如果您需要一个简单的分派机制,Alan提出的代码就是惯用的IMHO。 这里还有其他的可能性。你已经提到了一个:多种方法。 你的例子可以写成

(defmulti something class [arg])
(defmethod something String [arg] arg)
(defmethod something java.util.List [arg] (some-other arg)) 
在这种情况下,调度fn是
,但您可以实现任何类型的调度条件


还有
clojure.match
,一个通用的匹配库(以及其他库)。请参见

Clojure中基本上有3种分派方法:

  • 如Alan所述,将
    cond
    与谓词(即返回true或false且名称通常以
    结尾的方法)结合使用
  • 使用根据第一个参数的类型分派的协议。这方面的参考文件将在
  • 多种方法。您可以将Multimethods视为一种可编程的分派方法。他们可以做的不仅仅是查看参数的类型,他们还可以查看参数,计算向量参数上的元素等等。标准文档

  • 查看有关多方法与协议的简短讨论。

    除了使用多方法或方法进行显式检查外,还可以使用协议分派第一个参数的类型:

    (defprotocol OnArgTypeReturner
      (return-on-arg-type [arg]))
    
    (extend-protocol OnArgTypeReturner
      String
      (return-on-arg-type [arg] arg)
      clojure.lang.IPersistentList
      (return-on-arg-type [arg] "another-method-called"))
    
    (return-on-arg-type "foo")
    ;; => "foo"
    
    (return-on-arg-type '(1 2 3))
    ;; => "another-method-called"
    

    它起作用了!问题的另一部分是:是否有更好的方法(对语言来说更惯用)来做同样的事情?
    cond
    已经足够惯用了。您也可以尝试
    cond->
    这完全是惯用的,因为它非常简单和明显。非玩具问题可能需要协议或多方法,但事实并非如此。