Lambda 一个c++&引用;“功能对象”;(函子)是否在Clojure中定义?

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

我所说的“c++函数对象”(functor)是指:“为其定义函数调用运算符的对象。”

我想有几种方法可以做到这一点。例如,假设我们需要一个参数化函数:

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)