【问题标题】:Checking the arity of a function检查函数的arity
【发布时间】:2014-10-15 15:12:43
【问题描述】:

在 Haskell 中编程时,:type 命令很有帮助。 通过了解函数的数量和签名,我们可以快速理解某些构造的目的。 例如:

Prelude Control.Monad.Reader> :type (lift .)
(lift .) :: (Monad m, MonadTrans t) => (a -> m a1) -> a -> t m a1

在 clojure 中是否有等价物可以知道函数的数量(类型在 clojure 中不相关)?

例如,在我意识到 (-) 和 (*) 具有可变参数之前,我乍一看并不容易理解波纹管的组成:

(comp - *)

【问题讨论】:

  • 注意。 comp 返回的函数调用传递给comp 的所有函数,除了最后一个带有一个参数的函数,它调用最后一个带有传递给它的参数的函数。因此* 的可变参数重载与理解(comp - *) 相关,但- 的可变参数重载则不是。实际实现见(source comp)
  • @MichałMarczyk 是的,感谢您的精确度,我已经使用 repl 意识到了这一点。但是为什么 sourcedocfind-doc 总是用 lighttable 返回 nil
  • 你签出github.com/clojure/core.typed了吗?
  • 我愿意接受的唯一类型系统是具有相同特性的haskell one(不需要类型注释)。 :)

标签: clojure arity


【解决方案1】:

就个人而言,我使用 REPL。特别是(doc), (source), (find-doc) 实用程序。

例如:

用户=>(文档地图)
clojure.core/map
([f coll] [f c1 c2] [f c1 c2 c3] [f c1 c2 c3 & colls])
返回一个惰性序列,该序列由将 f 应用于 每个 coll 的第一项的集合,然后将 f 应用于集合 每个 coll 中的第二个项目,直到任何一个 coll 筋疲力尽。
其他 colls 中的任何剩余项目都将被忽略。函数 f 应该接受 number-of-colls 参数。

如您所见,很容易找到元数。

我同意 Haskell 在这方面是首屈一指的。

【讨论】:

    【解决方案2】:

    函数的参数列表存储在函数元数据中,您可以使用meta获取:

    (:arglists (meta #'*))
    

    【讨论】:

    • RuntimeException 分隔符不匹配:) clojure.lang.Util.runtimeException (Util.java:221)
    • @Chiron - 抱歉,已修复
    • :arglists meta 并不值得信赖——人们可以并且确实会覆盖默认值,主要用于文档目的。这甚至发生在 clojure.core 中,例如 defn 的宏扩展器是 3+ 参数的可变参数函数(其中前两个是隐式宏参数 &form&env), but the :arglists` 附加不会如果实际用于函数/宏定义,甚至会被解释为可变参数。
    • 看起来它适用于绑定对象,但不适用于 fn 之类的对象。 (meta (partial + 5)) -> 无
    • @MichałMarczyk 有解释:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多