2012-09-06 49 views
1

我是一個Haskell的完全noob我不能讓我的代碼工作,我不知道如何解決它!我需要幫助:)如果有人有一個想法,我需要看看,以解決我的問題,我會非常有益的想法和推動正確的方向。如何讓我的字符串重複x次?

我想創建一個類型的C#string.Format重複,直到列表完成。該列表是由userinput創建的,然後我只想要一個字符串被重複直到列表完成。

test :: Integer -> String 
    let list_n [0..k] 
    test k = putStrLn (r * r) | r <- list_n --My idea here is that i am forcing 
    --the entire list onto r and making it repeated as long as there is more in the 
    --list, But im not even sure that is possible :(

任何人有更好的主意,如何做到這一點?我希望所有的結果在一行而不是一排,因此即時通訊設法創建ittereration,但在HaskeLL這是更容易說,然後完成:/

+5

你讀過任何教程嗎?例如[LYAH](http://learnyouahaskell.com/chapters)或[RWH](http://book.realworldhaskell.org/read/)。 (例如,你的'let'的語法是錯誤的,你沒有正確使用列表理解,並且'putStrLn' *打印*一個字符串給終端,它不會產生一個字符串。) – huon

+1

我一定是在讀錯誤的東西:/ – user1501127

+1

我認爲你的代碼應該讀'test k = [putStrLn $ r * r | r < - [0..k]]'但我實際上並不明白你要求的是什麼 – Squidly

回答

4

這裏有兩個建議;一個嘗試匹配您發佈的代碼,另一個嘗試匹配您發佈的英文。這似乎主要是一個關於語法的問題,所以我不確定有很多有意義的解釋可以與「閱讀教程」不同。

-- match the code 
test :: Int -> String 
test k = concat [show (r * r) | r <- [0..k]] 

-- match the English 
test :: Int -> String -> String 
test k s = concat [s | r <- [0..k]] 
+7

英文版的另一種形式是'test k = concat。複製k' – pat

+1

@pat,或者甚至'test =(concat。)。 replicate'。 – huon

+2

@dbaupp point free讓我頭疼的時候推遠,儘管我喜歡boobs combinator:'test =((。)。(。))concat replicate',而scaramanga:'test = concat。:replicate' – pat

3

這裏的東西是接近勢在必行風格:

import Control.Monad (forM_) 

test :: Int -> IO() 
test n = forM_ [0..n] (\i -> putStrLn $ show $ i*i) 

這大致可以翻譯成: 「每個我在[0到n],做......」

3

也許你的意思是打印一個給定的字符串n次,並且你似乎想用每個字符串開始一個換行符,而且你似乎想要使用列表理解,這將是

test :: Integer -> String -> IO() 
test n xs = sequence_ [putStrLn xs| i<- [1..n]] 

但你會扔掉你計算的整數i。你會更好做

test n xs = replicateM_ n (putStrLn xs) 

這給

Main> test 3 "Hello" 
Hello 
Hello 
Hello 

也許你的意思是展現他們自己的數字字符串,這將是

test n = sequence_ [putStrLn (show i)| i<- [1..n]] 

但同樣,這將是更好做

test n = mapM_ putStrLn (map show [1..n]) 

這兩個給

Main> test 3 
1 
2 
3 

但是,主要是,你需要做的是首先跟隨一個很好的介紹文本。我推薦Learn You a Haskell for Great Good

如果你編輯你的問題,使其更清晰你想要什麼,這將有極大的幫助。你想要什麼輸出?