【问题标题】:Generate a list representing a doorbell system生成代表门铃系统的列表
【发布时间】:2020-10-05 10:55:07
【问题描述】:

我正在尝试从两个Ints 和另一个元组列表生成一个列表,以表示公寓楼的门铃系统。第一个数字是楼层数,第二个数字是“不存在”/我们跳的楼层,列表是楼层的公寓分布。例如:

geneList 10 4 [("Rgt", 10), ("Lft", 8), ("Cent", 3)]

(在本例中,我们将有 10 层,而第 4 层不存在。只有前三层有 'Cent' 'Rgt' 和 'Lft' 公寓。从 5 到 9 层只有 'Rgt' 和 '左”公寓。10 到 11 层只有“右”公寓。)

返回值必须是:

["1Rgt","1Lft","1Cent","2Rgt","2Lft","2Cent","3Rgt","3Lft","3Cent","5Rgt","5Lft","6Rgt","6Lft","7Rgt","7Lft","8Rgt","8Lft","9Rgt","9Lft","10Rgt","11Rgt"]

我尝试了不同的方法,但始终没有达到结果。

我最后一次尝试是:

geneList :: Int -> Int -> [(Char, Int)] -> [Char]
geneList 0 _ _ = []
geneList x y xs = [a++b | a <- [1..x+1], b <- xs, (\=) a y]

有人可以帮帮我吗?

【问题讨论】:

  • 预期结果中的最后一个元素不应该是11Rgt吗?
  • 我不确定我是否正确理解了这个问题,但是如果每个元组中的snd 数字代表这个“边”存在多少层,那么这不是geneList 的第一个参数( x) 冗余?
  • 您还应该发布失败尝试的输出。
  • @MarkSeemann 是的,它应该是 11Rgt,我现在更正了,谢谢。我认为,第一个参数是让它更简单,比如如果我尝试geneList 0 3 [('N',3), ('S',1)] 它是不可能的,或者如果我尝试类似geneList 3 10 [( 'A',3), ('B',3)] 返回值将是 ["1A","1B",""2A","2B","3A","3B"]。我没有知道我是否说清楚
  • geneList 4 10 [('A',3), ('B',3)] 应该返回什么?

标签: list haskell tuples


【解决方案1】:

首先让我们计算一个楼层的数字:

floorNum skip n = if n < skip then n else n + 1

现在让我们获取楼层名称的公寓名称

apartments :: [(String, Int)] -> Int -> Int -> [String]
apartments spec skip floor = [f ++ name | (name, max) <- spec, floor <= max]
  where f = show $ floorNum skip floor

我们可以为所有楼层收集这些:

geneList floors skip spec = [name | floor <- [1..floors], name <- apartments spec skip floor]

【讨论】:

    【解决方案2】:

    这些是您的代码中的问题:

    1. "Rgt" 的类型是String(又名[Char]),而不是Char
    2. 不等比较运算符写成/=,而不是\=。 (仔细阅读文档!)
    3. 您没有确保当前楼层最多为每间公寓的高度。
    4. 当您编写b &lt;- xs 时,b 是一个(String, Int) 元组。你应该改写(apartment_name, apartment_height) &lt;- xs

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-15
    • 2018-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多