星期六, 10月 04, 2008

Haskell Learning Note(3)

試論curring

在Haskell中,不用C++這麼複雜的方法來解決問題,而是採用curried function來解決這個問題。

Prelude> let add x y = x + y   -- 簡單來說就是寫一個 (+)
Prelude> :t add
add :: (Num a) => a -> a -> a -- 此時的add是一個具有兩個引數的function
Prelude> :t add 1
add 1 :: (Num t) => t -> t -- 此時的add 1 是具有一個引數的function
Prelude> :t add 1 2
add 1 2 :: (Num t) => t -- 此時的add 1 2是一個不具有引數的function

在Haskell裡,使用單純的curried function即可解決,寫起來很像C++的function default arguemnt,意義不太一樣,在Haskell裡是真的把引數代入形成一個新的function,其實+ operator也可以做出同樣的功能(Josh Ko說這是語法糖XD)

Prelude> :t (+)
(+) :: (Num a) => a -> a -> a
Prelude> :t (1+)
(1+) :: (Num t) => t -> t
Prelude> :t (1+2)
(1+2) :: (Num t) => t

寫到這裡我在想,我幹麻沒事自己寫一個add呢 XD那麼,可以試著用map寫出一點有趣的東西

Prelude> map (1+) [1..10]
[2,3,4,5,6,7,8,9,10,11]

當然,一個curried function在FP中的功用不止於此,curried funciton可以做更多事,隨你寫,隨你造,而不用C++ STL裡的bind2nd這種相較之下較不直覺的方法。curried fuction的好處是在Haskell底下是lazy evaluation,也就是說,你function引數可以不用給全,直到你要求把答案算出來的那一刻把argument給全就行了,而且可以隨你組合,隨你寫,可以做出相當多的靈活變化,也就是說,curried function並非要求一次把function arguement給齊,在Haskell底下大部分的funciton都是curried function。

那麼有沒有要求要一次給齊的,換個腦子想想,就是uncurried function,在這樣子的一個function底下,沒有一次給足所有的argument就會出錯(一時想不到有什麼function)。

補充:當我們寫(1+)而我們又呼叫這個function時,是類似C++的default argument還是wrapper function的技法呢,如果記得是沒有錯,是前者,也就是說,不管怎麼compose,都是只有一層的呼叫,相當的方便。


---
真糟,寫的真少。

Haskell Learning Note(3) - 前傳

我本來想要參考和Josh Ko的MSN對話紀錄來這一篇的,但是發現MSN對話紀錄竟然不見了...Orz

funciton interface如何改變

一個function,會有0個至多個不等的argument,而function只有一個signal output(當然也不一定是signal output,你可以說傳一個list出來,說我傳了一堆東西,但是就整體而言,你還是傳了一個符合某一個type的東西出來),這對 functional programming更是如此,基本上就算是function name相同但是arguments 個數不同的話,我們仍視為不同的function

先跳回C/C++,眾所皆知,C++有著function overloading機制(靠著compile-time決定呼叫那一個function,為一個static-linking),基本上靠著這樣子的機制,避免非常多的name collision。

題外話,C++靠著三種機制來避免name collision,一種是name scope,一種是funciton overloading,一種是polymorphism,不過很可惜的是,沒有類似Java裡的inner class來避免一次性的class使用,但是到了boost,有提供lambda calculus來解決部分的問題。

或許換個角度來想,程式碼複用性一直是一個很重要很重要的問題,以function層面而言,最常見的wrapper function

int add(int a, int b){
return add(a, b, 0);
}

int add(int a, int b, int c){
return a+b+c;
}
當然,這個程式在C++中可以更簡單的寫成
int add(int a, int b, int c=0){
return a+b+c;
}
這些都是程式撰寫上的技巧,不足以掛齒,在寫程式的單純呼叫function時,引數是不足以構成問題的,可是call-back function上呢,在STL algorithm的比較呢,以STL的find_if為例。
template<lass InputIterator, class Predicate>
InputIterator find_if(InputIterator first, InputIterator last,
Predicate pred);
其中的Predicate要求傳入一個value type的變數,傳回bool,也就是說,如果你的function不是一個引數,是不符合Predicate的要求,那麼就無法變成find_if所能使用的function object。

STL所提供的解決方法有二,如果你要求剛好是function object adaptor和predefined function object組合起來可解決,那麼就使用組合技,第二個方法為,自行撰寫一個較為general function object ,再使用funciton object adaptor來改變一個function object的interface。舉個簡單的例子
std::find_if(u.begin(), u.end(), std::bind2nd(std::less<int>(), 0)); //尋找某個區間第一個小於0的數字。
我不能不說,我當初看到這樣子的寫法,我以為找到了救星,funciton可以玩組合技耶,而且這樣子的確解決了call back function的問題。

利用wrapper function或者是STL裡面的function object adapter或種種程式語言的技能的確可以改變一個function原本的interface,但是有沒有更好的方法? 有啊,不然我就白寫了,看到Haskell的方法之後,以前的我好傻好天真(大誤)~XD。

---
還沒進入正題XD

星期四, 10月 02, 2008

有趣的圖



靠腰這圖真是彷彿穿透了我的內心,洗滌了我的靈魂,讓我淚如雨下~我應該認真面對的~m(__.__)m

好友gb014388的創作,還是以後blog走這種路線也不錯XD?

---
歡迎廣為流傳XD

猜測

我不喜歡去猜測人的想法,雖然大部分人的行為都有跡可循,但是僅止於明顯的行為部分。

常常會有說者無心,聽者有意的狀況發生,我最近常常下意識的去猜測其他我所不認識人的想法,感到非常漸愧,這不是我該做的事。或許有90%的事是可預測的,但是我們遇到的事常常是落在10%的範圍,程式可以預測行為,但是人的預測,往往有太多足以造成蝴蝶效應的因素而難以預測,我的做法相當直接,傾向直接詢問,當然,詢問的方法往往也得適當。

最近的自己,或許會縮自內省自己世界的狀況,被親人責斥,其實不管問題的源始為何,如果發生這樣子的問題,只能說,如果自己沒有做錯什麼或表達錯什麼,不會發生這樣子的事,所以最該做的是反省自己。

雖然發生很多事,很多想寫的,仍得靜下心來看待每件事

---
無欲則剛

星期二, 9月 23, 2008

Google Calendar 和 iCal 同步

在Google Calendar推出CalDav之後,以前只能單純的利用iCal訂閱Google Calendar,要更動還是得從網路上,並不能做雙向同步,現在單純的利用CalDav之後,就可以同步了

官方說明網址

簡單的來說,就是在 偏好設定 中 新增帳號
使用者名稱,你的帳號,一定要打全名,ex: google@gmail.com
密碼,莫在提
帳號URL: https://www.google.com/calendar/dav/{你的Google Calendar帳號}/user

不過一個iCal的新增帳號,只能擁有一組日曆,如果你有很多組日曆的話,看一下你的日曆id再進行新增。

這樣子不管改那一邊,都可以同步喔XD

---
我每次都要把最後一句寫的好神奇XD

複雜

我果然還是不擅長處理複雜的事。

---
媽的,誰能教我。

星期日, 9月 21, 2008

回顧

在我下筆的此時,其實只僅僅是複賽交件。

去年的此時此刻,我同時在比賽,在cllee的指導下,我比了去年國網高速運算和今年中華電信電信應用加值大賽。第一次比完,收工的時候其實真的很高興(接近一個月沒睡好),這一次比完只有簡單的鬆了一口氣的感覺。或許再多比幾次就會很習慣了XD。不過對我而言

比賽的結束代表大學生活的告一段落。

我的大學生活極其簡單,念書、研究、思考概括了全部的生活,在前三年的大學生活,我得學會太多太多事,撇開技術不談,對於人生價值的觀察,已經起了根本性的改變。人其實在每一個時段都很難準備好當下該做的事,因為都得同時看著未來,我在大學生活學會的其中一件事。

活在當下看著未來。

如果每個當下都是為了未來努力,那麼現在的當下一定顯得可憐,我的人生很簡單,只是單純的想要把事情做好,做好的同時,常常會帶來異想不到的驚喜。

大學生該學的技能或者是該有的心態,已經有太多文章在討論了,而我選擇的,是一個最簡單的方式。若要說大學和高中有什麼最大的差別,我想,高中的學科其實並不困難,為了因應所謂的大考而必需把熟練度拉到極高,大學的課程並不簡單,雖然老師僅僅考課堂上的東西,考不好或許會調分,但是如果不是對這個學門有所興趣進而下功夫苦讀,或許什麼都學不到,僅僅只是拿到一張文憑,而且這張文憑也不能說明什麼事。我在我的前三年生活中,大部分的科目是用混的混過去的XD 但是有極少數的科目,或許學校沒教,或許學校教很少,但是我肯花時間學習我想要學的東西,其實這就夠了。很多科目其實只要肯花時間,沒有學不會的道理,但是我只能說我念書的時間仍然太少。

當班上同學都立志考取好學校時,我祝福,但是我同時也想跟自己的學弟妹說,好好的想想,大學和研究所文憑對自己而言是什麼? 如果真的虛渡了六年的時光,或許真的是一件非常可惜的事。

有看到朋友的網誌,怕自己沒有準備好,我真的覺得朋友是一個很認真的人,我的想法是,人永遠沒有準備好的時候,但是人可以靠著自己的熱情與時間(或許是肝XD?)去克服很多很多問題,大學之所以學不好,因為還沒有找到領域想要定下來,多聽聽多看看,有一定的學習廣度,大學生活其實就不虛此行了,找到目標就會等於找到不停止的動力,在這之前,確定自己所要的是什麼。沒有所謂的強與弱,我所認識的強者或者一般人稱為的神人,都是在該領域專注極長時間下的結果,有足夠的專注及熱情,其實每個人都一樣的。

或許我下一個該思考的問題是,讓自己變好和所謂的反社會傾向有什麼關係?

---
有一種還沒寫完的感覺。

星期二, 9月 16, 2008

興趣

pigtail 的興趣是balabala(族繁不及備載),看到很多人都有明確的興趣,我的興趣為何?

寫作,閱讀,思考,寫程式。

---
結果花的時間剛好是反向序列XD

星期一, 9月 15, 2008

倒數

今天是開學,比賽只剩一個禮拜,而文件和程式大致上完成了,還有一些事要做。

每當我規律作息一段時間之後,就會有某幾天比生理時鐘早上很多醒來,通常這些天,我會好好的思考一些事,不然就拿來閱讀書籍,今天是特別早的日子,但是我卻覺得空盪盪。

颱風來了三天,雖然現在已經遠離台灣了,但是天空依舊黑沉,算了,收拾傢伙去實驗室吧。

eating問,我寫什麼是比較認真的,當這篇文章沒有出現大量XD的時候,大概就是我寫作比較認真面對的時候。

---
胡言亂語。

星期五, 9月 12, 2008

颱風

去年的中秋節我沒有回家,因為比賽進入倒數最後一個禮拜,今年的中秋節依舊沒有回家,今年的比賽依舊剩最後一個禮拜。

去年和今年都有颱風,也是一種很奇妙的記憶。

---
風雨變大了,明天大概是燕麥片+泡麵 XD

星期三, 9月 10, 2008

有趣

今天看ptt C_and_CPP 版,PcGrek 版友寫了一個非常有趣的code


double** mat = (double**)malloc( h*sizeof(double* )+
w*h*sizeof(double));
double* x = (double* )(mat + h);
for(int y = 0; y!=h ; ++y, x+=w )
mat[y] = x;

free(mat);


---
看懂真的覺得很有趣

專題進度

09/20就要交出複賽文件了,在昨天cllee就停止要求增加新功能,我倒是蠻高興的,並不是說不樂於接受挑戰和工作,實則是想要把已經寫的程式,好好的修補一番,最近的這幾個禮拜都陷入在修改已知的bug和增加未知的功能上。

Clara: yen3,程式有bug喔~
yen3: 我記下來了(寫在紙上~)

yen3: Clara,database有功能要加。
Clara: 嗯嗯,馬上加好。
yen3: eating可以拜託你嗎? 有GUI要修改。
eating: 沒問題。

cllee: 程式那裡可以再加個功能。
yen3: 我這幾天會寫(寫在紙上~)

當然,今天也要開始對說明文件進行排版,發現,這個暑假過的很快,時間勒過就親象是鳥仔勒飛~是時候把最後一段該做的事完成了。

我想,該是跟Clara借個相機,我想把一些事照下來。自己的相機,也不是說不愛惜,電池六年,再怎麼充都會沒電,還是得尋求一個解決方案就是了。

---
還有好長一段路要走。

星期二, 9月 09, 2008

魔幻奇緣

簡介

常聽過胡迪尼,但是不知道是誰。看wiki也覺得這個人頗有趣的。

---
應該從內心來關心,而不是從表面。

星期四, 9月 04, 2008

國境之南

國境之南

詞:嚴云農

如果海會說話 如果風愛上砂
如果 有些想念遺忘在漫長的長假
我會聆聽浪花 讓風吹過頭髮
任記憶裡的愛情在時間潮汐裡喧嘩

非得等春天遠了夏天才近了
我是在回首時終於懂得(也許天氣永遠會那麼熱)
當陽光再次回到那 飄著雨的國境之南
我會試著把那一年的故事 再接下去說完

當陽光再次離開那 太晴朗的國境之南
妳會不會把妳曾帶走的愛 在告別前用微笑全歸還

海很藍 星光燦爛 我仍空著我的臂彎
天很寬 在我獨自唱歌的夜晚
請原諒我的愛 訴說的太緩慢

星期二, 9月 02, 2008

認真

認真的玩一場吧。

---
人生

想法

人是一種以形而上的思考和形而下的慾望結合。

若說要懂了什麼,恐怕只能說什麼都不懂,但是學會面對自我想法時,往往帶著一種嘲笑,拆開成赤裸裸的慾望時,其實人與人之間沒什麼不同。

堂而皇之的華麗遮掩了原始慾望的單純,拆開包裝之後剩下的又是什麼呢?但不幸的是,人長越大,自已為自己覆蓋的一層包裝,張愛玲所說的荒涼於心中徘徊不散。

一個故事就此開始。

---
序

星期一, 9月 01, 2008

最近

最近,其實,生活很平靜,今天才去看了海角七號,有很多想法,等過一陣子再寫。

禮拜六日,為了不要讓自己太無聊,繼續寫程式,把cllee交待的新工作做的差不多了,明天要meeting,希望能順利一點,明天早上再把最後一個bug修掉即可。閒暇時利用一些時間在看boost,覺得有趣的東西都是functional programming的東西,所以我還是回來看FP好了。

還有三個禮拜複賽截止,還有二個禮拜就開學,不用打卡,不用寫工作日誌的第一天,其實很棒,但生理時鐘早就被調成打卡的作息了,早上八點醒來,下午五點吃飯,或許就這樣子發現我很容易被某件事制約?

也一直想寫一些黑暗的東西,但是心情太平靜,反而寫不出來? 也好,寫些平淡的東西也不錯。

---
閒聊文

星期六, 8月 30, 2008

小試一下

第一次裝boost,雖然知道很久,但是一直沒時間試,今天寫了簡單到爆的程式碼

#include <boost/array.hpp>
#include <iostream>
#include <algorithm>
int main(){
boost::array<int, 10> a;
for(unsigned int i=0;i<a.size();i++) a[i] = i;
std::copy(a.begin(), a.end(), std::ostream_iterator<int>(std::cout, " "));
std::cout << std::endl;
}
輸入指令如下
g++ -I /usr/local/include/boost-1_36/ test.cpp
可獲得如下結果
0 1 2 3 4 5 6 7 8 9 

---
我真無聊XD

星期四, 8月 28, 2008

Fink Project

Fink Project 是一個可以讓你以套件管理形式來管理OpenSource的安裝套件,整個安裝說明在此在dkg解壓縮之後,安裝完,記得把"FinkComander" 移入應用程式中,會有一個非常像ubuntu的套件管理程式(其實安裝指令也有部分雷同,估計兩者有血緣關係XD),可以試試,比起MacPorts而言,有更多選擇。

---
學習。

旅行

暫定這個時候,09/20複賽截止,還有很多事可以做。

---
準備與期待