2012-02-05 28 views
29

我已經瀏覽過的許多Haskell教程幾乎完全集中在幾乎完全沒有涵蓋如何構造程序的語法上。Haskell程序的基本結構

例如...

這裏有一個C的一個最基本的輪廓++應用程序:

#include <iostream> 
using namespace std; 

int addition (int a, int b) 
{ 
    int r; 
    r=a+b; 
    return (r); 
} 

int main() 
{ 
    int z; 
    z = addition (5,3); 
    cout << "The result is " << z; 
    return 0; 
} 

當我第一次開始學習C++,像這樣的例子讓我非常學習如何組裝個人件進工作方案。也許我正在尋找錯誤的地方,但是我一直無法找到任何對Haskell來說都很直接和簡單的例子。

我已經知道很多Haskell語法。我可以編寫遞歸列表解析,並操縱字符串,整數和列出wazoo。

總之:我只想知道兩個子例程和變量傳遞在Haskell中看起來是什麼樣子。如果我能夠對如何構建Haskell程序有一些基本的瞭解,那麼我最終可以將我學到的所有語法都用到某種用途上。

+2

我會從像http://www.haskell.org/haskellwiki/Haskell_in_5_steps這樣的地方開始學習Clojure。不過,我確實有O'Reilly Haskell的書,而這本書 - http://www.nostarch.com/lyah.htm - 似乎正在得到很多好評。 – octopusgrabbus 2012-02-05 22:20:37

+3

雖然這是一個合理的問題,但請允許我建議您接近Haskell有一點錯誤。 Haskell儘可能強調純函數,大多數Haskell實現提供了一個REPL(讀 - 評估 - 打印循環),您可以在其中定義函數。我強烈建議,不要製作打印到stdout的小程序,只需編寫函數並在ghci中使用它們播放。我想你會發現學習Haskell更加靈活和有趣。 – 2012-02-05 23:21:36

+0

@DanBurton我可能花了上個月閱讀語法,並在ghci中使用函數和列表解析。我準備好現在製作一個節目。 (:D你說得對,因爲我一直在接近Haskell的錯誤,我試圖將過程式編程原則應用於函數式編程語言,我仍然試圖圍繞如何將一堆函數轉化爲某些東西它可以做的不只是運行一次並停止,我會繼續閱讀 – 2012-02-06 00:31:22

回答

32

Haskell程序的結構非常簡單。你有一個main功能,這是IO,這就是它。所以基礎:

module Main where 

addition a b = a + b 

main :: IO() 
main = do let z = addition 5 3 
      putStrLn $ "The result is: " ++ show z 

現在你可以使用像這樣編譯成一個簡單的程序:

ghc --make Main.hs -o program 

,它應該產生調用的程序的可執行文件。

一般來說,程序的結構主要是純粹的函數,實際的計算結合了處理IO的代碼的分立部分。 (當然也有例外,但編寫儘可能多的純代碼的一般想法是相當普遍的。)

由於幾乎所有東西都表示爲一組純函數,因此不會在它們之間傳遞變量 - - 函數通過傳遞參數進行通信。

代碼IO的部分代碼位於main。在大多數情況下,全部你的IO將通過main;即使您單獨編寫IO操作並給出它們的名稱,它們最終也會從main開始執行。

Haskell中的「函數組」被稱爲「模塊」。您可以有多個模塊,每個模塊都有自己的文件:

module Blarg (exportedFunction) where 

helper a b = ... -- this will *not* be exported 
exportedFunction a b = helper a b -- this *will* be exported 

只有括號中的標識符纔會真正導出;其餘的都是隱藏的。如果您根本不包括括號,則默認情況下會導出所有內容。

將本文件保存爲Blarg.hs。現在,您可以在Main導入:

import Blarg 

到組函數的另一個有效方法是where

complicatedFunction a b c = helper 0 
    where helper count = ... 

這樣helper僅在範圍爲complicatedFunction,也有獲得abccomplicatedFunction

+0

謝謝您的回覆。我熟悉main,但是如何製作其他子例程,並讓這些子例程相互通信並傳遞變量? – 2012-02-05 22:22:06

+3

你並沒有真正的「子程序」,你有*功能*。由於沒有突變,你可以將值作爲參數傳遞給這些函數(例如,在我的示例中爲'addition 5 3')。 – 2012-02-05 22:23:54

+0

沒錯。我的意思是說,你如何製作其他「功能組」?基本上,我試圖不把所有東西都放在主要位置。 – 2012-02-05 22:26:11