Lambda 一个c++&引用;“功能对象”;(函子)是否在Clojure中定义?
我所说的“c++函数对象”(functor)是指:“为其定义函数调用运算符的对象。” 我想有几种方法可以做到这一点。例如,假设我们需要一个参数化函数:Lambda 一个c++&引用;“功能对象”;(函子)是否在Clojure中定义?,lambda,clojure,functional-programming,functor,Lambda,Clojure,Functional Programming,Functor,我所说的“c++函数对象”(functor)是指:“为其定义函数调用运算符的对象。” 我想有几种方法可以做到这一点。例如,假设我们需要一个参数化函数: f(x) = sin(x*freq) // maths 我们可以使用“函数构造函数”: 但是,如果我们想读取sin1或sin2中的参数,该怎么办 我们有多少方法可以做到这一点 谢谢。我不确定您到底在问什么,但是您可以通过满足clojure.lang.IFn界面定义一个可作为函数调用的记录: (defrecord Adder [x] cloj
f(x) = sin(x*freq) // maths
我们可以使用“函数构造函数”:
但是,如果我们想读取sin1
或sin2
中的参数,该怎么办
我们有多少方法可以做到这一点
谢谢。我不确定您到底在问什么,但是您可以通过满足
clojure.lang.IFn
界面定义一个可作为函数调用的记录:
(defrecord Adder [x]
clojure.lang.IFn
(invoke [_ y]
(+ x y)))
((->Adder 3) 4) ; => 7
我不确定您到底在问什么,但您可以通过满足
clojure.lang.IFn
接口定义一个可作为函数调用的记录:
(defrecord Adder [x]
clojure.lang.IFn
(invoke [_ y]
(+ x y)))
((->Adder 3) 4) ; => 7
(def加法器(部分+3))
(增编4)
另外,创建一个闭包也可以做同样的事情
(defn生成加法器[x](fn[y](+x y))(def加法器(部分+3))
(增编4)
另外,创建一个闭包也可以做同样的事情
(defn make adder[x](fn[y](+xy))根据@exupero的答案,我推导出以下“窦”示例代码
;;
鼻窦---
;频率:R//state
;R->constructor()
;R->()->R//这是调用
;freq()->R//getter,实际上它是freq:R
;; -------------
(除氟记录窦[频率]
;;
实现此接口,以便
;显示为“函数对象”
;;
clojure.lang.IFn
(调用[x]
(数学/正弦(*freq x)))
;; -----------------------------
;;“main()”
;; -----------------------------
;;
;s1根据@exupero的回答,我为“窦”示例推导出以下代码
;;
鼻窦---
;频率:R//state
;R->constructor()
;R->()->R//这是调用
;freq()->R//getter,实际上它是freq:R
;; -------------
(除氟记录窦[频率]
;;
实现此接口,以便
;显示为“函数对象”
;;
clojure.lang.IFn
(调用[x]
(数学/正弦(*freq x)))
;; -----------------------------
;;“main()”
;; -----------------------------
;;
;;s1@Carcigenicate是的,那是itA函子是不一样的-将函数提升到其他类型的一种方式。@Carcigenicate是的,那是itA函子是不一样的-将函数提升到其他类型的一种方式。但是,要小心,fn?
谓词会为这样的对象返回false
。对于这个用例,我将uld质疑使用功能接口而不是显式协议的设计决策。但是,请注意,fn?
谓词将为此类对象返回false
。对于此用例,我将质疑使用功能接口而不是显式协议的设计决策。
;;
;; --- Sinus ---
;; freq: R // state
;; R -> constructor()
;; R -> () -> R // this is invoke
;; freq() -> R // getter, in fact it is freq: R
;; -------------
(defrecord Sinus [freq]
;;
;; implement this interface so Sinus
;; appears as a "function object"
;;
clojure.lang.IFn
(invoke [_ x]
(Math/sin(* freq x))))
;; -----------------------------
;; "main()"
;; -----------------------------
;;
;; s1 <- new Sinus (2.5)
;;
(def s1 (Sinus. 2.5))
;;
;; s1.freq()
;;
(:freq s1)
;;
;; s1(4)
;;
(s1 4)