1. 程式人生 > >用 Haskell 求解 ACM 競賽題(1):Hello,World!

用 Haskell 求解 ACM 競賽題(1):Hello,World!

找了一本用C語言編寫的ACM競賽教程,把其中的程式用 Haskell 重寫一遍,這可能是熟悉 Haskell 的最好辦法。首先我們看一看 Hello 程式如何實現。如果有 C 語言基礎,應該很容易理解 Haskell 程式碼。

Hello, world

main = do
    putStrLn "Hello, world!"

程式碼相當簡單吧。其中 putStrLn 相當於 C 語言的 printf。
其中:

  • putStr “字串”:顯示字串,不換行
  • putStrLn “字串”:顯示字串,換行

算術表示式

計算機的“本職”工作是計算, 因此下面先從算術運算入手,看看如何用計算機進行復雜的計算。

程式 1-1 計算並輸出 1 + 2 的值

C 語言程式碼:

#include< stdio.h>
int main() {
	printf("% d\ n", 1+ 2); 
	return 0; 
}

這是一段簡單的程式,用於計算 1+ 2 的 值, 並把 結果 輸出 到 螢幕。Haskell 程式如下:

main = do
    return (1 + 2)

當然也可以寫成這種形式:

main = do
    putStrLn (show (1 + 2))

其中:

  • show 數字 : 把數字轉換成字串

程式 1- 2   計算並輸出 8/ 5 的 值, 保留小數點後 1 位

C 語言程式碼:

#include< stdio.h> 
int main() { 
	printf("%. 1f\ n", 8. 0/ 5. 0); 
	return 0; 
}

Haskell 語言程式碼:

main = do
    putStrLn (show ((fromIntegral (floor (8.0/5.0*10.0+0.5))) / 10.0))

其中:

  • fromIntegral 整數:用於把整數轉化為浮點數。因為 Haskell 對資料型別檢查很嚴格,不會把整數自動轉化為浮點數的,必須用 fromIntegral 顯式作資料轉換。這樣做的好處,可以減少程式設計的錯誤。

C 語言中很簡單的問題在 Haskell 中貌似複雜了很多。其實,如果 C 語言庫函式中沒有事先提供 printf 函式的話也很麻煩。我們會看到 C 語言和 Haskell 各有所長,很多情況下,Haskell 種很簡單的事情,C 語言實現起來卻繁瑣的很。