2010-10-03 86 views

回答

6

我對Clojure瞭解不多,但至少在這裏有一些提示。

的關鍵功能,使F#代碼好的是圖案代數數據類型匹配。代數數據類型例如是Expression類型(用於表示數學表達式)的聲明,並且模式匹配是match構造,用於在實現簡化或區分時檢查各種已知情況。

我不認爲Clojure有任何內置的模式匹配支持,但它可以作爲一個庫來實現。一個看起來很有趣的圖書館是patter-match module(在Clojars中)。這是一個使用它的例子to implement algebraic evaluator(這非常接近F#文章)。

F#文章中出現的另一件事是活動模式(它允許您聲明和重用模式)。我不認爲有這樣的Clojure庫,但考慮到語言的靈活性,它應該也可以實現它們(但是,它們在F#文章中並不是必需的)

+1

Clojars不是圖書館,而是Clojure圖書館的回購:http://clojars.org/ – 2010-10-04 07:39:05

+0

@Matti:感謝您的更正! (我更正了我的答案) – 2010-10-04 12:12:18

6

Lisp has象徵性計算曆史悠久。見Peter Norvig的the AI case study book。 Lisp提供了很多偉大的語言功能來抽象符號上的常用操作。有時你可以寫出真正簡潔的代碼(比F#更簡潔/更短)。

像F#這樣的靜態語言在數據類型上具有強類型系統和方便的模式匹配。編譯器可以發現類型系統捕獲的錯誤,例如,沒有考慮一個特例。考慮數據的類型也可以減少運行時錯誤的機率。 F#中的類型推斷也使得F#代碼非常簡潔。

+0

爲PAIP +1,一直在閱讀它兩週,這是偉大的迄今 – spacemanaki 2010-10-04 19:04:43

4

符號差異化是lisp的第一個應用之一!

我做了一個關於簡單的符號差異的博文。它只處理+和*,但它很容易擴展。

這是我寫的一個系列文章的一部分,它介紹初學者在倫敦召開的一次會議上介紹clojure,以展示clojure操縱自己的代碼是多麼容易。

當然可愛的東西是做了差異化,代碼可以編譯!因此,您可以生成用戶輸入的不同版本,或生成函數及其派生的宏等。

原來是在這裏,和很好的語法高亮:

http://www.learningclojure.com/2010/02/clojure-dojo-4-symbolic-differentiation.html

但是我在這裏發佈的代碼,所以你可以看看:

;; The simplest possible symbolic differentiator 

;; Functions to create and unpack additions like (+ 1 2) 
(defn make-add [ a b ] (list '+ a b)) 
(defn addition? [x] (and (=(count x) 3) (= (first x) '+))) 
(defn add1 [x] (second x)) 
(defn add2 [x] (second (rest x))) 


;; Similar for multiplications (* 1 2) 
(defn make-mul [ a b ] (list '* a b)) 
(defn multiplication? [x] (and (=(count x) 3) (= (first x) '*))) 
(defn mul1 [x] (second x)) 
(defn mul2 [x] (second (rest x))) 


;; Differentiation. 
(defn deriv [exp var] 
    (cond (number? exp) 0                ;; d/dx c -> 0 
     (symbol? exp) (if (= exp var) 1 0)           ;; d/dx x -> 1, d/dx y -> 0 

     (addition? exp) (make-add (deriv (add1 exp) var) (deriv (add2 exp) var))  ;; d/dx a+b -> d/dx a + d/dx b 
     (multiplication? exp) (make-add (make-mul (deriv (mul1 exp) var) (mul2 exp)) ;; d/dx a*b -> d/dx a * b + a * d/dx b 
             (make-mul (mul1 exp) (deriv (mul2 exp) var))) 
     :else :error)) 


;;an example of use: create the function x -> x^3 + 2x^2 + 1 and its derivative 
(def poly '(+ (+ (* x (* x x)) (* 2 (* x x))) 1)) 

(defn poly->fnform [poly] (list 'fn '[x] poly)) 

(def polyfn (eval (poly->fnform poly))) 
(def dpolyfn (eval (poly->fnform (deriv poly 'x)))) 



;;tests 

(use 'clojure.test) 

(deftest deriv-test 
    (testing "binary operators" 
    (is (= (let [m '(* a b)] [(multiplication? m) (make-mul (mul1 m) (mul2 m))]) [true '(* a b)])) 
    (is (= (let [m '(* a b)] [(addition? m)  (make-add (add1 m) (add2 m))]) [false '(+ a b)]))) 
    (testing "derivative function" 

    (is (= (deriv '0 'x)    '0)) 
    (is (= (deriv '1 'x)    '0)) 
    (is (= (deriv 'x 'x)    '1)) 
    (is (= (deriv 'y 'x)    '0)) 
    (is (= (deriv '(+ x x) 'x)   '(+ 1 1))) 
    (is (= (deriv '(* x x) 'x)   '(+ (* 1 x) (* x 1)))) 
    (is (= (deriv '(* x x) 'y)   '(+ (* 0 x) (* x 0)))) 
    (is (= (deriv '(* x (* x x)) 'x) '(+ (* 1 (* x x)) (* x (+ (* 1 x) (* x 1))))))) 
    (testing "function creation: d/dx (x^3 + 2x^2 + 1) = 3x^2 + 4x " 
    (let [poly '(+ (+ (* x (* x x)) (* 2 (* x x))) 1)] 
     (is (= ((eval (poly->fnform poly)) 3) 46)) 
     (is (= ((eval (poly->fnform (deriv poly 'x))) 3)))))) 
0

是的,一個系統,如您現在描述上存在Clojure的!它不過是格里蘇斯曼的同伴系統,而他的智慧的--SICM(經典力學的結構和解釋)一書。對於Clojure,它被命名爲sicmutils,並由Colin Smith移植。

我在別處簡單描述了它 - https://stackoverflow.com/a/41646455/4070712 - 但總而言之,它確實做了F#文章提到的四件事情,即,

  1. 分化:
  2. 簡化代數表達式
  3. 格式化表達式

和其他更多的

  • 解析的...

    1)分化(全部分分化支持)

    > (defn ff [x y] (* (expt x 3)(expt y 5))) 
    > ((D ff) 'x 'y) ==> (down (* 3 (expt x 2) (expt y 5)) (* 5 (expt x 3) (expt y 4))) 
    > ;; i.e. vector of results wrt to both variables 
    

    NB。兩種類型的載體支持,「向上」和「向下」,以適應協變和逆變表達

    2)表達的簡化:哦,是的......

    > (def unity (+ (square sin) (square cos))) 
    > (unity 'x) ==> 1 ;; yes we can deal with symbols 
    

    3)格式:表達式可以在TeX中呈現爲美麗的展示。 我不能在這裏輕鬆展示,但目前正在開發中,使用Clojure的「Gorilla」作爲楓式風格的筆記本電腦/工作休息室。

    4)解析:很明顯。表達式和函數之間的轉換是系統的核心部分。

    看一看https://github.com/littleredcomputer/sicmutils。你甚至不需要Clojure來運行它,你可以使用提供的Java jar文件。