gpt4 book ai didi

Haskell 在第 n 个位置插入一个元素

转载 作者:行者123 更新时间:2023-12-05 09:18:49 26 4
gpt4 key购买 nike

嗨,我开始学习 haskell,但我想不出一个主题。

假设我有一个列表:[1,2,3],我正在尝试编写一个函数以在第 n 个位置插入元素。任何线索我该怎么做?

最佳答案

您可以像这样构建一个 insertAt 函数:

insertAt :: a -> Int -> [a] -> [a]
insertAt newElement 0 as = newElement:as
insertAt newElement i (a:as) = a : insertAt newElement (i - 1) as

此类问题的一种策略是为某些边缘情况编写代码并使用递归直到找到边缘情况。

提到的lens package 简化了数据结构的处理,因为代码可能会变得更短、更易于编写,但代价是要学习额外的库。

这两个示例都强调有多种方法可以解决您的问题。我建议看看 Data.List模块以进一步了解典型的列表操作。 source因为 drop 函数对您来说可能是一个好的开始。此外,所提供的 splitAt 函数可能是解决您的问题的合适构建 block 。


正如 Shersh 正确提到的那样,insertAt 的上述实现存在一些缺陷:它不检查负数位置,并且在给定的情况下继续递归。这在无限列表的情况下尤其糟糕。

我们可以通过使用守卫轻松改进实现:

insertAt :: a -> Int -> [a] -> [a]
insertAt newElement _ [] = [newElement]
insertAt newElement i (a:as)
| i <= 0 = newElement:a:as
| otherwise = a : insertAt newElement (i - 1) as

此实现试图通过在有疑问时立即插入 newElement 来做正确的事情。也可以编写一个 insertAt 版本,而不是将错误抛到我们面前:

import Data.Monoid ((<>))
import qualified Data.List as List

insertAt :: a -> Int -> [a] -> [a]
insertAt newElement i as
| null as && i != 0 = error "Cannot insert into empty list other than position 0."
| null as && i == 0 = [newElement]
| i >= 0 = let (prefix, suffix) = List.splitAt i
in prefix <> [i] <> suffix

为简洁起见,此版本还使用了 List.splitAt

关于Haskell 在第 n 个位置插入一个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43291442/

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