首頁>技術>

Haskell是最著名的函數語言程式設計語言。Haskell魔法之一是函式。

函式

熟悉其他程式語言的朋友們對於函式不會陌生。例如,在C++中,定義四個函式。

備註:演示。函式採用的演算法未充分最佳化。

// 返回整數引數之和int add(int x, int y) { return x + y;}template<T>T add (T x, T y) { return x + y; }// 將整數陣列的元素加倍int* double_us(int numbers[], size_t len){    for (size_t i = 0; i < len; ++i) numbers[i] *= 2;    return numbers;}//返回一個整數的因子std::vector<int> divisors(int x){  std::vector<int> v;  for (int i = 1; i <= x; ++i)   {   	if (x % i == 0) v.push_back(i);   }  return v;}// 判定素數bool prime(int x){    return divisors(x).size() == 2; }

Haskell的函式和C++函式類似,有函式名、引數、返回值型別。對應上面的四個C函式,Haskell函式定義如下。

-- 返回整數引數之和add :: Num a => a -> a -> aadd x y = x + y-- 將整數陣列的元素加倍double_us :: Num a  => [a] -> [a]double_us xs = map (*2) xs-- 求一個整數的因子divisors :: Integral a => a -> [a]divisors x = [k | k <- [1 .. x], mod x k == 0]-- 判定素數prime :: Integral a => a -> Boolprime = (==2) . length . divisors          

Haskell的函式定義,起首函式名,例如add。緊跟著引數x和y,引數之間以空白符號間隔。等號=之後是函式體 x + y。

Haskell特別之處在於,函式的型別宣告。見證魔法的時候到了。

add :: Num a => a -> a -> a

上面這行程式碼描述了add函式的引數型別(數字型別類)、返回值型別(數字型類)、引數和返回值必須是同一型別。Num a代表數字型別類,包括整數型別(例如Int)、浮點型別(Float)。聰明的你看出來來嗎?我們用Haskell定義的add函式是“範型”函式,比C++版本(Template)的add函式定義更簡單明瞭,更容易看懂,更精確。

Haskell的魔法中的魔法在於,事實上,add :: Num a => a -> a -> a 這行程式碼可以省略,Haskell編譯器能自從推匯出來!於是,之前我們寫下來的Haskell程式碼精簡為,

-- 返回整數引數之和add x y = x + y-- 將整數陣列的元素加倍double_us xs = map (*2) xs-- 求一個整數的因子divisors x = [k | k <- [1 .. x], mod x k == 0]-- 判定素數prime = (==2) . length . divisors          

神奇吧?服不服?

Haskell函式的魔法遠不止這些。下期介紹部分函式(partial function)。

11
最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • leetcode986_go_區間列表的交集