我有一个名为list_apple的函数,当给定数字5时,它会使用putStr(list_apple 5)逐行打印5 "apple“。即:
list_apple :: Integer -> String
list_apple k = concat["apple\n" | x <- [1..k]]结果:
apple
apple
apple
apple
apple 我调用的另一个函数a_row_of_apple,给出了一个数字5
a_row_of_apple :: Integer -> String
a_row_of_apple k = concat["apple " | x <- [1..k]]结果:
apple apple apple apple apple Aim: --我试图使用上面的两个函数定义一个名为list_all_apple的函数
list_all_apple :: Integer-> String结果:
apple
apple apple
apple apple apple
apple apple apple apple
apple apple apple apple apple我的尝试:使用列表理解的
list_all_apple :: Integer -> String
list_all_apple k = list_apple k ++ a_row_of_aaple k| x<-[1..k]但没有起作用。我考虑过使用zip函数。但是,zip有两个列表,我有两个字符串。
发布于 2014-03-15 02:57:22
你可以这样做:
list_all_apple k = concat [(a_row_of_apple $ x - 1) ++ list_apple 1 | x <- [1..k]]当然,由于list_apple 1只是计算为"apple\n",所以您也可以等效地编写:
list_all_apple k = concat [(a_row_of_apple $ x - 1) ++ "apple\n" | x <- [1..k]]它可以进一步简化为@wonce's解决方案:
list_all_apple k = concat [a_row_of_apple x ++ "\n"| x<-[1..k]](因为(a_row_of_apple $ x - 1) ++ "apple\n" = a_row_of_apple x)
话说回来,我认为您不可能真正地将list_apple有效地组合到这个函数中,因为每一行中的单词"apple"之间的空格:
apple
apple apple
apple apple apple
apple apple apple apple
apple apple apple apple apple必须在每个换行符(\n)之前。
您还可以通过利用已经使用列表理解的事实来摆脱concat:
list_all_apple k = [s | x<-[1..k], s <- a_row_of_apple x ++ "\n"]或者您只需使用unlines,而不必添加换行符"\n"或使用concat。
list_all_apple k = unlines [a_row_of_apple x | x<-[1..k]]发布于 2014-03-15 01:55:43
虽然不使用*list_apple*,但这将是一个解决方案:
list_all_apple :: Integer -> String
list_all_apple k = concat[a_row_of_apple x ++ "\n"| x<-[1..k]]https://stackoverflow.com/questions/22418583
复制相似问题