December 2007 Archives

函數編程(Functional Programming)

| No Comments

From: iThome

函數編程之風雲再起 文/iThome (記者) 2007-12-26

不同於過去,現在的網路、多核心技術、高速處理器、軟體複雜度等發展態勢,正是適合函數編程生存的環境,值得我們持續關注它的發展。

甫於日前落幕的Software Development 2.0研討會,來賓之一的Andrei Alexandrescu被問到未來編程語言的趨勢時,他認為函數編程(Functional Pogramming)可能會再度興起。我認同他的看法,我過去發表的JavaFX文章中,碰巧也有提到這一點。

目前兩大開發平臺(Java與.NET)都開始出現函數編程思維的蹤跡。Java平臺的JavaFX語言,具備所有重要函數編程的特色,所以應該歸類為函數語言(或者至少是多重思維語言);.NET平臺的C# 3.0也存在相當多函數編程的影子。微軟的LINQ本來就源自於函數語言,更不用提微軟官方的F#語言,F#沿用相當多ML語言的語法,更是徹底的函數語言(其中的F,應該是Functional的意思)。

根據Tiobe對於2007年12月語言需求所做的統計,物件導向語言占54.4%,程序語言(Procedure Language)占41.9%,函數語言占2.0%,而邏輯語言占1.8%。以上加起來剛好百分之百。

但是,這樣的分類並不精確。現在的語言很少是單一思維,幾乎都是多重思維(Multi-paradigm),特別是物件導向和函數編程,因為兩者間並沒有衝突的地方,許多物件導向語言會漸漸納入函數編程的特色。例如,儘管C# 3.0具有相當多函數語言的特色,但是依然會被Tiobe歸類於物件導向語言的類別。

函數編程最重要的基礎是Lambda Calculus,在C# 3.0稱為「Lambda表示式」,在Python稱為「Lambda函數」,在PowerShell稱為Scriptblock(劇本區塊),在 Java稱為匿名方法(Anonymous Method),不同語言會用不同名詞稱呼它,但其實都是類似的東西。從這個角度來看,許多主流語言多少都具備函數編程的能力。這個趨勢應該會延續下去,許多既有語言推出新版本時,會持續加入函數語言的特色。

另外,我最喜歡的REBOL,許多人工智慧專家使用的Common Lisp,近年興起的Erlang,Perl高手唐鳳專精的Haskell,這些也都是函數語言。為什麼我們喜歡函數編程?因為函數編程可以讓我們把時間花在有生產力的事情上,而不是處理許多瑣碎的事。簡單地說,函數語言可以讓我們用簡單的方式寫程式,但是威力又強大。

編程語言專家Ravi Sethi教授認為「簡單」與「威力」,正是函數編程的兩大優勢。簡單,來自於以「值」(Value)為中心,不用理會下面平臺是什麼機器、記憶體要如何配置、如何指定。函數編程的威力,則來自於「遞迴」以及將函數視為「First-class」(一等)的值(函數本身就是值,可以被傳遞、被指定)。

自動記憶體管理雖然始於函數語言,但是近年來已經進入各大主流語言。而將函數視為一等的資料型別,也開始進入各大主流語言。這些都要歸功於函數語言,尤其是Lisp。

Lisp是函數語言的始祖,誕生於1958年,相當於50年前。換算成人類年齡的話,Lisp已經算是程式語言中的人瑞了。Lisp的後繼者眾多,其中,至今仍然最活躍的是誕生於1980年代的Common Lisp,它在Tiobe的排名是第十七名。在Peter Seibel寫出《Practical Common Lisp》一書,並得到Jolt Award之後,讓大家逐漸對Common Lisp一改印象,開始認為它不只是學術上的語言,而是一種務實的語言。

一般來說,相較於C、Pascal這類命令式編程(Imperative Programming),函數編程的缺點是效率比較差,這也是函數語言一直無法流行的主因之一。不過,隨著處理器速度的提升,編譯器技術的進步,都讓效率不再是問題,甚至在數學運算上,用Clean與OCaml(這些都是函數語言)開發出來的程式,效率也不會比C差。

尤其是在多核心處理器和分散式運算時代,函數編程更是比Imperative編程具有更強的優勢。例如近年來逐漸受到重視的Erlang,正是將重點放在Concurrency與容錯上。用Erlang可以輕鬆開發出來的系統,如果改用別種語言開發,可能會造成程式長度暴增以及不穩定的情況。

如果你想學習函數編程,而且如果你使用.NET平臺,我會建議你使用F#;如果你使用Java平臺,你可以考慮JavaFX;如果你沒有Java與.NET平臺考量的話,那麼你可以選擇Common Lisp與Erlang。

若未曾使用過函數編程技術,思維就會受到傳統Imperative編程作法的拉扯,一開始時會很不習慣,但只要堅持下去,等到跨過門檻之後,函數編程其實更自然,生產力更高。

有些技術沒有被大眾所接受,並不是因為它不好,而是因為當下時空環境無法配合等因素所造成。不同於過去,現在的網路、多核心技術、高速處理器、軟體複雜度等發展態勢,正是適合函數編程生存的環境,值得我們持續關注它的發展。

其實很多非常強大的程式語言就只用Function,如:Matlab,但也因為它的Function Library非常多。

Sorting Function in LotusScript

| No Comments

Form SharePlace

Dim lstMyList List As String
Dim strTags As String

lstMyList ("B") = "List"
strTags = |"B"|
lstMyList ("A") = "Sorting"
strTags = StrTags & |:"A"|
lstMyList ("D") = "Simple"
strTags = StrTags & |:"D"|
lstMyList ("C") = "Is"
strTags = StrTags & |:"C"|


Then, use @Sort formula function to sort "lstMyList".
Dim varTagsArray As Variant
varTagsArray = Evaluate (|@sort (| & strTags & |)|)

Second choice: Bubble Sort Algorithm
Form: IBM

Sub bub_sort (in_array As Variant)
'returns a sorted array based on a complexity of O(n^2) using a bubble sort
If Not Isarray(in_array) Then
Print "bub_sort: not receiving array"
Exit Sub
End If

Dim top, bot, cur, cur2 As Integer
top=Ubound (in_array)
bot=Lbound (in_array)

If top=bot Then
Print "bub_sort: only one element"
Exit Sub
End If

Dim tmp_element As Variant

For cur=bot To top
cur2=cur
Do While cur2 > bot 'bubble up
If (in_array(cur2) > in_array(cur2-1)) Then
Exit Do
Else
'swap
tmp_element=in_array(cur2)
in_array(cur2)=in_array(cur2-1)
in_array(cur2-1)=tmp_element
End If
cur2=cur2-1
Loop
Next
End Sub

如何恢復 Linux 上刪除的文件

| No Comments

All is full of Love

| No Comments

突然想起前陣子看到的一個 Music video,All is full of Love,在十月的當代藝術館,V2_特區 動態媒體─行動,互動,第一次看到,應該很多人都被這部機器人MV感動到,尤其配著冰島女歌手碧玉的聲音更顯哀傷,導演克里斯‧康寧漢(Chris Cunningham),說年輕時最喜歡色情片跟機器人,這部MV同時完成這兩個心願。
而看到這部MV便聯想到攻殼機動隊2無罪(Innocence),兩部都是想闡述機器人思想和情慾,這部All is full of Love是在1999年出現的,但卻或多或少有著攻殼機動隊的影子,或許導演克里斯也是從攻殼得到的靈感吧!會將這MV寫出來是想保留當初看到時的感動,不想遺忘它。
阿特拉斯有更多的介紹。

October 2008

Sun Mon Tue Wed Thu Fri Sat
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  

Archives

Pages

Powered by Movable Type 4.21-en

About this Archive

This page is an archive of entries from December 2007 listed from newest to oldest.

November 2007 is the previous archive.

January 2008 is the next archive.

Find recent content on the main index or look in the archives to find all content.