Functional programming 在这个简单的例子中演示一级函数

Functional programming 在这个简单的例子中演示一级函数,functional-programming,clojure,abstraction,code-reuse,Functional Programming,Clojure,Abstraction,Code Reuse,请使用这两个重叠的Clojure函数向初学者演示用于代码重用的一流函数(或其他一些函数编程概念)。基本上,使用函数式编程方法简化下面的代码块 作为比较,您将如何在您选择的其他函数式语言中实现它 insertR和insertL是简单的首次出现插入函数。如你所见,它们只相差一行 ;test case (def newkey :cake) (def oldkey :and) (def lat '(:bacon :lettuce :and :tomato :and :jelly)) ; list of

请使用这两个重叠的Clojure函数向初学者演示用于代码重用的一流函数(或其他一些函数编程概念)。基本上,使用函数式编程方法简化下面的代码块

作为比较,您将如何在您选择的其他函数式语言中实现它

insertR和insertL是简单的首次出现插入函数。如你所见,它们只相差一行

;test case
(def newkey :cake)
(def oldkey :and)
(def lat '(:bacon :lettuce :and :tomato :and :jelly)) ; list of keywords

(defn insertR [newkey oldkey lat]
  (if (empty? lat)  
    '()
    (if (= (first lat) oldkey)
        (cons oldkey (cons newkey (rest lat))) ;;; diff line
        (cons (first lat) (insertR newkey oldkey (rest lat))))))

(defn insertL [newkey oldkey lat]
  (if (empty? lat)
    '()
    (if (= (first lat) oldkey)
        (cons newkey lat)  ;;; diff line
        (cons (first lat) (insertL newkey oldkey (rest lat))))))
以下是输出

=> (insertR newkey oldkey lat)
(:bacon :lettuce :and :cake :tomato :and :jelly)
=> (insertL newkey oldkey lat)
(:bacon :lettuce :cake :and :tomato :and :jelly)

下面是一个使用一流函数重构的示例:

(defn insert [newkey oldkey lat f]
  (if (empty? lat)
    '()
    (if (= (first lat) oldkey)
      (f oldkey newkey lat)
      (cons (first lat) (insert newkey oldkey (rest lat) f)))))

(defn insertL [newkey oldkey lat]
  (insert newkey oldkey lat 
    (fn [oldkey newkey lat] (cons newkey lat))))

(defn insertR [newkey oldkey lat]
  (insert newkey oldkey lat 
    (fn [oldkey newkey lat] (cons oldkey (cons newkey (rest lat))))))

不,我正在自学函数式编程,这个问题刚刚出现。我可以通过模板模式在OO中实现,但不知道如何在FP中实现。我正在寻找一些函数式编程的插图来展示一种更健壮的方法。特别是,我怎样才能在这个应用程序中使用一流的函数呢?嗯,这并不是很简单。将(如果(空?纬度)“()…)替换为(当(顺纬度)…)。在clojure中,我们用nil代替空列表。@nickik-这个问题是关于向初学者展示如何使用一流函数,而不是关于遵守clojure习惯用法…@rshallit当然,但我认为对于初学者来说,学习正确的(clojure)方法尤为重要。这绝不是批评,只是一个小小的补充。