2013-10-09 24 views
0

我正在學習Haskell,並且我還不是很擅長它...... 我讀過的一些教程(Haskell's String IOLearn You a Haskell)已經解釋了很多關於IO的內容,但我還是沒能寫我需要的功能:使用字符串參數在Haskell中打開文件

TutorialCopy inputName outputName = do 
            contents <- Str.readFile inputName -- Opens the target File. 
            writeFile outputName contents  -- Creates the destination File. 

這裏的想法是基於輸入文件的位置(「inputName」)來讀取一個文件,並有它傳遞到輸出文件(「outputName」)內容。我也嘗試了功能類型:

TutorialCopy :: FilePath -> FilePath -> IO() 

甚至:

TutorialCopy :: String -> String -> IO() 

在沒有任何成功,因爲GHCI當我宣佈簽名或數據構造錯誤時,我不返回簽名錯誤。

我感謝所有的幫助,謝謝!

+0

這是什麼?使用'Str.readFile'似乎很奇怪,但是使用普通的'writeFile'而不是'Str.writeFile'。 –

回答

3

Haskell有一些強制命名約定。函數名稱必須以小寫字母開頭,數據類型和構造函數以大寫字母開頭。將您的功能的名稱更改爲tutorialCopy,應該修復它。

+0

謝謝,它幫助,但沒有解決問題...這一次它產生了一個不同的錯誤:'IOTutorial01.hs:14:94: 無法匹配類型'Str.ByteString'與'[Char]' 預期類型:字符串 實際類型:Str.ByteString 在WRITEFILE的'的第二個參數」,即內容' 在‘做’塊的語句:WriteFile的outputName內容 在表達式: 做{內容< - Str.readFile inputName; writeFile outputName contents}' – Zeh

+0

@Zeh這意味着你正在嘗試使用'ByteString'接口來讀取文件而不是'String'接口。 'ByteString'是一個由庫提供的類型,它有許多有用的應用程序,其中'String'不會削減它,這對於網絡IO等事情來說非常有用。 – bheklilr

+0

@bheklilr事情是,我沒有在我的代碼上明確使用任何'ByteString',這與我在問題中所使用的完全相同。 – Zeh