【问题标题】:Clojure: function composition at runtimeClojure:运行时的函数组合
【发布时间】:2014-07-29 12:31:13
【问题描述】:

问题:

假设我想在运行时编写一组函数 f_1 ... f_n,例如:

(f_a (f_b (f_c) (f_d)) (f_e))

因此我需要每个函数的参数类型和返回值,以便知道我可以将哪些函数相互插入。

第一次尝试:注释每个函数

(defn foo [n f]
  ^{:params [Number clojure.lang.Fn]
    :return String}
  (do stuff with f and n, return a string))

由于显而易见的原因,我不喜欢这种方法,例如,如果我想使用 clojure.core 作为函数集,我将不得不注释每个函数,这不是很理想。

问题

  1. 您将如何尝试解决此问题?

  2. core.typed 能帮我解决这个问题吗?

【问题讨论】:

    标签: clojure function-composition


    【解决方案1】:

    在编写要传递给 solr 的搜索查询并使用映射作为所有函数的参数时,我会做类似的事情,并让它们都返回一个映射,其中包含函数决定在映射中进行的任何更改,以及其他所有内容原样返回。所以简而言之,我会:

    1. 为每个函数的输入和输出使用映射
    2. core.typed 没有帮助,因为一切都是地图
    3. prismatic.schema 非常很有帮助,因为您可以使用它来了解需要哪些键并编写验证这些映射结构的测试。

    在这种情况下,更倾向于使用静态类型函数式语言的项目/人员可能会转向使用 monad,因为它们是一种以类型安全的方式描述组合的强大工具。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-14
      • 2016-12-09
      • 2011-05-04
      • 2015-12-15
      • 2023-03-10
      • 2011-11-07
      相关资源
      最近更新 更多