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, как первый монады, люди используют, чтобы узнать, как таковой) не являются самые легкие вещи, чтобы опустить голову. Я предлагаю оставаться чистым, пока вы не почувствуете себя в безопасности.