2012/12/20

Haskell Range

Range顧名思義就是範圍,範圍亦即取n~m

在Haskell範圍是這樣用的[n..m],下方我們輸入[1..50],則會出現1~50之間的數字


當然這次又要白目一點到著來,輸入[50..1],則輸出[]。
這代表著Range不能反向,不過當然也有函式可以反向,在後面的章節會介紹的






數字是有範圍性的,那字母呢?輸入['a'..'z'],則會輸出"abcdefghi..."。捷克啊,這也太方便了吧?



當然還是要來倒著試試看,輸入['z'..'a'],則會輸出""




突然疑問從腦海中飄過去,英文字母可以從a到Z嗎?來試試看吧!輸入['a'..'Z'],則會輸出"",原因應該是因為每種程式語言的字母都是用ASCII碼為規範的



輸入['A'..'z'],則會輸出"ABCDEFG..xyz"




講解到這,來溫故一下國小的數學題目吧!
還記得如果第一個數字是1,第二個數字是3,則第三個數字是5,那第N個數字會是多少呢?
那當然是第一項值 + (要取第幾項 - 1) * 差距』,不知道的人可以回去看看等差數列

為什麼要突然講這個呢?等等就會體悟了


輸入[1,3..50],則會輸出1,3,5,7,9...49!!這不就直接幫你找出1~50且間隔2個數字嗎!!!!



輸入['A','C'..'z'],會輸出"ACE..uwy",還蠻方便的可以找出間隔2個字母


根據參考文章作者講法是不建議用浮點數,因為不太準確,在設計上可能沒有納入這個考量吧,畢竟浮點數精確度要怎麼訂也要看應用



而且根據作者說要如何取10個間隔2個數值,有個方法是[2,4..10*2]
我認真看了一下這寫法為何不好,這思維有點像只取奇數或偶數的問題吧!所以他才打入10*2



另一個方法則是用take去取得,輸入take 10 [1,3..],會輸出1~n的前十個數字,如果不懂take用法可以參考Haskell List這篇文章


參考文章作者有提到replicate函數,是用來取n個相同的值


對了要小心使用replicate以及repeat函數,否則會會向我一樣跑出無窮迴圈






最近期中考很忙,不過還是很熱衷Haskell。
某天同學問我Haskell到底哪裡吸引你?我深思了一下,嗯…我愛數學。
接著又被追問,JavaScript可以跟HTML結合使用,Haskell可以跟哪種語言結合使用呢?
嗯…我不太知道欸…。我只知道我還沒學很深而已…


參考文章:
http://learnyouahaskell-zh-tw.csie.org/zh-tw/ready-begin.html#