2016-09-18 64 views
0

我正在使用Idone.com網站,並希望運行此代碼,但不知道從stdin編譯的語法putStrLn使用此代碼,但剝離錯誤。使用putStrLn來顯示結果

main = putStrLn (show (sumaCifras x)) 
sumaCifras:: Int -> Int 
sumaCifras x = div x 1000 + mod (div x 100) 10 + mod (div x 10) 10 + mod x 10 

回答

4

編譯器有問題,因爲您在main函數中使用x,而不在此範圍內。首先你必須從輸入中讀取一個值,然後將它傳遞給你的函數。你可以通過兩種方式來完成。

更自然的使用命令式語言是「做」語法的人,它看起來就像是:

main = do 
     x <- getLine 
     putStrLn (show (sumaCifras (read x :: Int))) 

當你想用x詮釋,您必須使用「讀」功能與類型簽名,所以編譯器會知道會發生什麼。

把它寫在功能更強大的方式,你可以使用單子轉換,通過它像

main = getLine >>= (\x -> putStrLn(show (sumaCifras (read x :: Int))) 

的「>> =」操作符將從第一一元行動取得結果值(在這裏是IO操作獲取輸入)並將其應用於右側的函數(在這裏,它是lambda函數,它將輸入讀取爲Integer,應用您的函數並將其返回給putStrLn,將其輸出到屏幕上)。 「do」語法本質上僅僅是這種monadic操作的語法糖,所以它不會影響程序的執行或性能。

你可以走一步在寫它在功能上寫它完全

main = getLine >>= (putStrLn . show . sumaCifras . (read :: String -> Int)) 

請注意,在這裏你有型簽名讀取功能,沒有這個功能的說法,應用因此自由點字符串 - > Int。在這裏首先執行的是getLine函數。然後將從它獲得的輸入傳遞給read,它被轉換爲Int,然後是sumaCifras,然後通過show轉換爲String並用putStrLn打印。

+0

我試着按你給我的指引,idone.com運行該代碼,但拉錯誤說 prog.hs:5:18:輸入解析錯誤'=」 主要=做 X < - 函數getline (div x 100)10 + mod(div x 10)10 + mod x 10(mod x 10)mod 10(mod x 10)mod 10 –

+0

這可能是一個縮進問題。你可以用縮進來粘貼你的完整代碼嗎?在你的例子中,你有sumaCifras的縮進定義,但不應該縮進。你也許想在sumaCifras的等式中添加一些括號,因爲在目前的形式下,它可能不會產生結果。 – Antisthenes

+0

我該如何讀取兩個參數,例如g :: Float - > Float - > Float g n t = 2 - (7 /(5 ** n * t)) 這個main? main = getLine >> =(putStrLn。show。g。(read :: String - > Float)(read :: String - > Float)) –