【问题标题】:haskell, list of lists with a specific form (list comprehension)haskell,具有特定形式的列表列表(列表理解)
【发布时间】:2016-09-04 13:18:50
【问题描述】:

我想创建一个函数,该函数接受一个列表,并创建一个具有列表理解的列表列表,格式为 [[e1],[e1,e2],[e1,e2,e3]...]

例如:

f5 ['a','b','c'] = ["a","ab","abc"]
f5 [1,2,3] = [[1],[1,2],[1,2,3]]

我的代码:

f5 xs = [a | a <- xs]

-- tests:
*Main> f5 ["a","b","c"]
["a","b","c"]
*Main> f5 [1,2,3]
[1,2,3]

【问题讨论】:

  • 您的两个输入的类型不同。也许你的意思是['a','b','c']
  • 你说得对,我会改的!

标签: list haskell set list-comprehension


【解决方案1】:

这也有效

foldr (\x rest -> [x]:(map (x:) rest)) [] [1,2,3,4]

【讨论】:

    【解决方案2】:

    你可以这样做:

    f5 xs = [take index xs | (x, index) <- zip xs [1..]]
    

    为列表中的每个元素创建一个包含该元素及其索引的元组,从 1 开始。然后,通过使用take,对于压缩列表中的每个元素,从原始列表中获取适当数量的元素.索引中指定要获取的元素数量。

    实际上,我们甚至不需要元组中的x 元素,因此可以将其重写为

    f5 xs = [take index xs | (_ ,index) <- zip xs [1..]]
    

    【讨论】:

    • 你其实只需要长度,可以简化吗?到f5 xs = [take i xs | i &lt;- [1..(length xs)]]
    • @karakfa 谢谢。你们怎么总是想出这么好的答案? ;-)
    猜你喜欢
    • 1970-01-01
    • 2015-01-10
    • 2022-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多