gpt4 book ai didi

Haskell:为什么我的最后一个实现适用于空列表?

转载 作者:行者123 更新时间:2023-12-02 17:09:51 26 4
gpt4 key购买 nike

我正在完成 Graham Hutton 的《Programming in Haskell》一书中的练习,作为练习的一部分,我重新实现了 Haskell 的 last 函数,如下所示:

lasst xs = drop (length xs - 1) xs

现在这对于非空列表非常有效:

> lasst [1,2,3,4,5]
[5]

但是,令我惊讶的是,对于空列表,它返回一个空列表:

> lasst []
[]

我对此感到惊讶,因为我希望将 (length []) - 1 计算为 -1 以及随后对 drop - 的计算1 [] 抛出。

为什么我的实现会为空列表返回一个空列表,而不是抛出异常?

最佳答案

Haskell report '10指定 standard Prelude 。在本节中,我们看到:

drop                   :: Int -> [a] -> [a]  
drop n xs | <b>n <= 0</b> = xs
drop _ [] = []
drop n (_:xs) = drop (n-1) xs

因此,对于负数n,它将返回整个列表。这对于 documentation of drop 来说是有意义的。 :

drop n xs returns the suffix of xs after the first n elements, or [] if n > length xs.

因此列表的前 -1 元素根本不是元素。

drop 的示例之一对此进行了进一步介绍:

drop (-1) [1,2] == [1,2]

关于Haskell:为什么我的最后一个实现适用于空列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59671943/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com