我有一个名为 list_apple 的函数,当给出数字5时,它会逐行打印5个“apple” 使用putStr(list_apple 5)。即:
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
目标:我正在尝试使用上面的两个函数定义一个名为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有两个列表,我有两个字符串。
答案 0 :(得分:2)
你可以这样做:
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的解决方案:
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]]
答案 1 :(得分:1)
虽然没有使用* list_apple *,但这将是一个解决方案:
list_all_apple :: Integer -> String
list_all_apple k = concat[a_row_of_apple x ++ "\n"| x<-[1..k]]