结合Integer-> String类型的两个函数

时间:2014-03-15 01:49:45

标签: haskell

我有一个名为 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有两个列表,我有两个字符串。

2 个答案:

答案 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]]