Haskell - 尝试生成字符串列表(大小为m)(大小为n)

时间:2016-11-29 15:13:23

标签: haskell

我试图定义一个带有两个整数值m和n的函数。它返回一个可以显示为矩形的值。

e.g. rectangle 3 4
****
****
****

在我的代码中,我收到语法错误,说我输错了[Char],但我没有在任何地方使用char。

代码:

rectangle :: Int -> Int -> [String]
rectangle m n = generateRectangle m n []

generateRectangle :: Int -> Int -> [String] -> [String]
generateRectangle m n currentRectangle =
    if length currentRectangle < n then
        generateRectangle m n (addRow m ""):currentRectangle
    else
        currentRectangle

addRow :: Int -> String -> String
addRow size currentRow =
    if length currentRow < size then
        addRow size currentRow++"*"
    else
        currentRow

错误:

    ERROR file:test.hs:8 - Type error in application
*** Expression     : generateRectangle m n (addRow m "")
*** Term           : addRow m ""
*** Type           : [Char]
*** Does not match : [String]

1 个答案:

答案 0 :(得分:4)

您的addRow会返回String,即[Char]。但是,您的generateRectangle需要[String],即[[Char]]

    generateRectangle m n (addRow m "") : currentRectangle
                          ^^^^^^^^^^^^^
                          this is a String, not a [String]

相同
    (generateRectangle m n (addRow m "")) : currentRectangle

并且类型不匹配。

你的意思可能是:

    generateRectangle m n ((addRow m "") : currentRectangle)

请记住,功能应用程序具有最高优先级。

话虽如此,试着写一个函数

repeatNTimes :: Int -> a -> [a]

代替。然后,您可以使用该函数两次编写rectangle

rectangle n m = repeatNTimes ??? (repeatNTimes ??? ???)

也许你甚至知道一个像repeatNTimes那样的功能,但是先尝试自己弄清楚。