我试图定义一个带有两个整数值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]
答案 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
那样的功能,但是先尝试自己弄清楚。