2015-11-24 3 views
0

Я пытаюсь создать функцию, которая будет принимать два целых значения, которые соответствуют ширине и высоте прямоугольника 1s, который выведенного как так:Haskell - Создание прямоугольника 1s с высотой и шириной пользовательского ввода

Main> rectangle 3 4 
1111 
1111 
1111 

Я новичок в Haskell и не имею опыта, поэтому любые указатели будут оценены, и поэтому должны использоваться только базовые операции Haskell. Благодарю.

ответ

5
rectangle :: Int -> Int -> String 
rectangle h w = unlines (replicate h (replicate w '1')) 

Хотя это чистая функция, она показывает соответствующую часть. Вы можете просто putStrLn (rectangle 3 4), чтобы распечатать его, как ожидалось, в ghci, а не обернуть в show.

Не задумываясь, сделайте короткое пошаговое руководство.

replicate :: Int -> a -> [a] 
unlines :: [String] -> String 

Как вы можете видеть, replicate w '1' создает список ш раз Charakter 1. Потому что String = [Char], результат представляет собой строку из них, столько, сколько w говорит.

Теперь этот String реплицируется снова, h раз, давая список h раз этой строки.

unlines теперь объединяет эти строки, вставляя новый строковый символ между строками.

Результат - это то, что вы ожидаете, только то, что ghci (которое вы, кажется, используете), завершает результат каждого выражения в вызове show. Таким образом, чтобы делать то, что вы хотите достичь, вызов putStr в необходимости, как так:

impureRectangle :: Int -> Int -> IO() 
impureRectangle x y = putStr (rectangle x y) 

Обратите внимание, что монады (или IO, как первый монады, люди используют, чтобы узнать, как таковой) не являются самые легкие вещи, чтобы опустить голову. Я предлагаю оставаться чистым, пока вы не почувствуете себя в безопасности.

Смежные вопросы