2012-07-15 50 views
4

我必須編寫3個函數:一個將華氏轉換爲攝氏,一個將攝氏轉換爲開氏,另一個將華氏轉換爲開爾文,使用兩個第一函數。在Haskell中創建一個交互式程序

我從來沒有和Haskell一起玩過,所以這讓我花了相當長的時間,但現在我發現它很簡單。

無論如何,我需要爲前兩個函數創建交互式Haskell程序,並使用它們編寫和使用管道可執行文件,以獲得與第三個函數等效的內容。我一直在閱讀管道,它似乎很簡單。我的主要問題似乎是使功能交互。

任何幫助,提示和資源非常感謝!

+0

http://book.realworldhaskell.org/read/io.html – 2012-07-15 15:08:23

回答

4

在解決問題時,interact函數應該非常有用。由於UNIX慣例是過程應該使用文本(而不是數字,如溫度)進行通信,這意味着函數將功能包裝爲String並返回String。這意味着你必須將你的華氏/攝氏溫度功能包裹在新的函數中,這些函數可以接收和返回字符串而不是數字。

舉個例子,讓你開始,這個節目上,案件正在給它的所有字符串:

module Main (main) where 

import Data.Char (toUpper) 

main :: IO() 
main = interact upperCase 

upperCase :: String -> String 
upperCase = map toUpper 

你可以編譯:

ghc uppercase.hs 

...然後你可以使用它(在Linux上)這樣做:

echo "bla" | ./uppercase 
# Result: "BLA" 
+0

謝謝喲你這麼多的迅速答案!對不起,如果我很密集,請耐心等待。 我所做的是爲兩個第一個函數(celsiusToKelvin.hs和fahrenheitToCelsius.hs)創建一個單獨的.hs文件。我的理解是,使用管道,我應該可以做到: celsiusToKelvin.exe x | fahrenheitToCelsius.exe 應該給我同樣的答案,因爲我的第三個功能這是: 'fahToKel Z = celToKel(fahToCel Z)' 並在互動功能應用? – 2012-07-15 16:17:11

+0

如果你的程序應該使用管道,你不能'celsiusToKelvin x | fahrenheitToCelsius'。這需要'celsiusToKelvin'程序將其輸入作爲參數(其中'x'在該位置)而不是標準輸入流讀取。相反,你必須使用'echo x | celsiusToKelvin | fahrenheitToCelsius'。內置的'echo'程序將其參數寫入其標準輸出流,然後通過管道將其引導至'celsiusToKelvin'程序的標準輸入流。這將產生正確的結果。 – dflemstr 2012-07-15 16:21:57

+0

謝謝,這正是我所需要的。它完美的作品。我回來了我的任務標記,我在這個問題上得到了滿分。我的問題是,我的celsiusToKelvin和FahrenheitToCelsius程序每個都有字符串作爲用戶的提示,當將它們連接在一起時這當然不起作用。我把它們拿出來,它的工作! – 2012-07-25 23:13:02