【问题标题】:Haskell Trouble with ListsHaskell 列表问题
【发布时间】:2014-03-29 18:25:31
【问题描述】:

我是 Haskell 的新手,我正在尝试编写一个简单的函数,它接受一个整数列表并返回一个列表,以便将第一个元素添加到列表的所有元素中。

这是我目前所拥有的。

addFirstEl [] = []
addFirstEl (x:xs) = [x + x | x <- xs]

不幸的是,this 所做的只是返回一个没有第一个元素和其他元素加倍的列表。

【问题讨论】:

  • 只需为xs中的元素使用不同的名称
  • 谢谢!但是,第一个元素仍会从返回的列表中删除。

标签: list haskell list-comprehension


【解决方案1】:

列表推导中x 的绑定将变量x 从模式中隐藏起来。试试这个:

addFirstEl [] = []
addFirstEl (x1:xs) = [x1 + x2 | x2 <- xs]

编辑

回应您的评论

第一个元素仍然从返回的列表中删除

(x1:xs),xs 是列表的余数或tail。就是x1之后的所有元素,也就是head。如果您想将x1 添加到包括自身在内的所有元素中,您可以编写

addFirstEl [] = []
addFirstEl (x1:xs) = [x1 + x2 | x2 <- (x1:xs)]

head

addFirstEl [] = []
addFirstEl xs = [head xs + x | x <- xs]

【讨论】:

  • 我真的很喜欢head xs 版本,因为它清楚地表达了意图。
  • @AlainO'Dea 另一方面,head 是部分运算,因此每次使用head 都会给程序员增加负担——即证明其参数不为空。相比之下,第一个解决方案不需要任何证明,因此可以说更容易安全地使用。
  • @chi xs 不为空的证明是微不足道的,因为上面有一个空 xs 的单独案例。
  • @Cubic:如果xs 为空,head xs + x 部分将永远不会被执行。
  • 当然,在这种情况下,证明是微不足道的。尽管如此,提供一个微不足道的证据比根本没有证据更难。在一般情况下,证明可能不是微不足道的,标准类型检查之外的工具可能有助于建立正确性,例如community.haskell.org/~ndm/catch
【解决方案2】:

试试这个:

addFirstEl [] = []
addFirstEl l@(x:_) = [x + x1 | x1 <- l ]

addFirstEl [] = []
addFirstEl l@(x:_) = map (+ x) l

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-02
    • 2019-06-03
    • 2013-05-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多