Functional programming 在这个简单的例子中演示一级函数
请使用这两个重叠的Clojure函数向初学者演示用于代码重用的一流函数(或其他一些函数编程概念)。基本上,使用函数式编程方法简化下面的代码块 作为比较,您将如何在您选择的其他函数式语言中实现它 insertR和insertL是简单的首次出现插入函数。如你所见,它们只相差一行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
;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)方法尤为重要。这绝不是批评,只是一个小小的补充。