Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.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_Partial_Lambda_Combinators_Arity - Fatal编程技术网

clojure是否可以计算混合算术函数链,并在需要时返回部分函数?

clojure是否可以计算混合算术函数链,并在需要时返回部分函数?,clojure,partial,lambda,combinators,arity,Clojure,Partial,Lambda,Combinators,Arity,假设您有三个arity 1、2和3的函数,如下所示: (defn I [x] x) (defn K [x y] x) (defn S [x y z] (x z (y z))) clojure是否具有评估功能或用于评估的习惯用法: (I K S I I) as (I (K (S (I (I))))) 返回算术数为2的平数函数 我正在考虑创建一个宏,它可以接受上面的简单函数定义,并将它们扩展为可以返回部分结果的多算术函数。如果已经有一种内置的或惯用的方法来实现这一点,我就不想创建宏 以下是展开的

假设您有三个arity 1、2和3的函数,如下所示:

(defn I [x] x)
(defn K [x y] x)
(defn S [x y z] (x z (y z)))
clojure是否具有评估功能或用于评估的习惯用法:

(I K S I I) as (I (K (S (I (I)))))
返回算术数为2的平数函数

我正在考虑创建一个宏,它可以接受上面的简单函数定义,并将它们扩展为可以返回部分结果的多算术函数。如果已经有一种内置的或惯用的方法来实现这一点,我就不想创建宏

以下是展开的宏对上述函数的要求:

(defn I
  ([x] I x)
  ([x & more] (apply (I x) more)))

(defn K
  ([x] (partial K x))
  ([x y] x)
  ([x y & more] (apply (K x y) more)))

(defn S
  ([x] (partial S x))
  ([x y] (partial S x y))
  ([x y z] (x z (y z)))
  ([x y z & more] (apply (S x y z) more)))

我不确定我是否完全理解您正在尝试做的事情,但是函数对于您似乎正在谈论的这种“函数链接”非常有用。例如:

user> ((comp vec rest list) 1 2 3 4 5)
=> [2 3 4 5]
这相当于:

user> (vec (rest (list 1 2 3 4 5)))
=> [2 3 4 5]
在您的情况下,如果您有列表
(ik S I)
,并且您希望将其评估为
(I(K(S)(I(I)))
,我将使用
(reduce comp…
,但您也可以使用
(apply comp…

您可能还对或宏感兴趣。这些宏将其参数顺序嵌套到下一个参数中。
->
宏将嵌套到下一个表达式的第一个位置,而
->
宏将嵌套到下一个表达式的最后一个位置。如果“下一件事”是一个函数,则两者的行为将相同,并形成一个
(迄今为止嵌套的函数)
表达式,然后继续

事实上,最好的例子是:

(-> 1 (+ 10) (- 100) inc)
;//Expands to...
(inc (- (+ 1 10) 100))
;//Evaluating in the REPL...
user> (-> 1 (+ 10) (- 100) inc)
=> -88

(->> 1 (+ 10) (- 100) inc)
;//Expands to...
(inc (- 100 (+ 10 1)))
;//Evaluating in the REPL...
user> (-> 1 (+ 10) (- 100) inc)
=> 90

然而,您似乎更想做一些涉及自动咖喱的事情(尽管我也不完全理解),因此我不知道任何预先存在的内置方式。

也感谢您的回答。因为我对clojure和lisp类型的编程还不熟悉,所以我需要一段时间来摸索,看看它是否能简化我正在做的事情。有时我知道我想做什么,但不知道它叫什么,即使我有一个好的搜索词,clojure的结果也非常有限。只是发现我正在尝试的可能被称为“自动咖喱”是一个很大的帮助。刚刚发现这个,并认为它可能是完美的为您,如果没有其他,至少有帮助。。。
(-> 1 (+ 10) (- 100) inc)
;//Expands to...
(inc (- (+ 1 10) 100))
;//Evaluating in the REPL...
user> (-> 1 (+ 10) (- 100) inc)
=> -88

(->> 1 (+ 10) (- 100) inc)
;//Expands to...
(inc (- 100 (+ 10 1)))
;//Evaluating in the REPL...
user> (-> 1 (+ 10) (- 100) inc)
=> 90