我學習了命令式編程語言,主要是C++和C語言,所以功能方法對我來說是非常新的。當我在寫函數/方法之前,我通常採用「增量」方法(可能大多數人都這樣做):編寫一小部分代碼,然後檢查結果是否如預期的那樣(通常由只是用printf或std :: cout將它們打印到stdout中),改進算法,增強算法,然後檢查到目前爲止的結果是否如預期的那樣(通常只需將它們打印到標準輸出或標準輸出),精煉...我很少寫完整的方法。Haskell診斷輸出
基本這個「增量」的方法是有診斷輸出(printf的或std :: COUT在我的例子以上)的能力。但是在Haskell中(據我瞭解截至目前),如果我想 - 比如說 - 使用'putStrLn'將某些內容寫入標準輸出,我必須更改函數的簽名,因爲'putStrLn'只返回一個IO Monad包含我想要打印的信息,但不會在調用'putStrLn'時打印它,對嗎?所以每次我想使用'putStrLn'進行診斷輸出時,我都必須更改當前函數的簽名以及所有其他函數的調用方式等。
所以有一種便宜且簡單的方法將函數的「局部變量」的值打印到標準輸出中?
或者僅僅是這樣一個事實:我要求的是一個標誌,我不瞭解Haskell編程的基礎部分?
但並不意味着我將有很多功能,因此命名空間將滿的功能呢?因爲在函數中局部定義許多輔助函數使得它們無法從外部訪問,因此很難嘗試...另外,爲這些函數找到有意義的函數名將更加困難,並且我看到了Haskell中保留函數名稱的趨勢簡短...這一切都讓我困惑:)在C++中,例如,儘量保持「本地」和儘可能封裝... – Sh4pe 2013-02-10 11:51:57
在Haskell中,我們使用模塊和導出列表進行封裝。爲函數尋找有意義的名字並不比通過一些練習找到局部變量的名字更困難。我認爲Haskell的趨勢就是保持經常使用的函數名稱簡短。我經常對模塊內部函數有很長的描述性名稱,這些名字只用於我目前正在使用的代碼中的一個例子'boundedValueBlockTraversal'。我也傾向於完整地記錄這些功能,這會產生非常易讀且易於維護的代碼。 – jix 2013-02-10 19:00:33