0

有没有简单的方法来浏览列表?假设我想访问列表中的第 5 个数据,但不知道它是 B

["A","A","A","A","B","A","A","A","A"]

有没有办法我可以做到这一点而不必对列表进行排序?

4

4 回答 4

3

我不太了解 Miranda,但我期待这些功能skip并且take可用。

您可以通过使用跳过和获取功能来解决第 5 个元素。当 skip 和 take 不可用时,您可以轻松地自己创建它们。

skip:跳过列表中的y个元素,当y大于列表中的项目数时,将返回一个空列表

take:取列表中的前 y 个元素,当 y 大于列表中的项数时,将返回完整列表。

skip y []     = []
skip 0 xs     = xs
skip y (x:xs) = skip xs (y-1)

take y []     = []
take 0 xs     = []
take y (x:xs) = x : take (y-1) xs

elementAt x xs = take 1 (skip x xs)
于 2011-10-29T10:16:12.567 回答
2

另一种方法是使用 ! 操作员。假设您有一个程序在列表中定义了数据,例如:

plist = [A,A,A,A,B,A,A,A,A]

然后执行plist!4将为您提供该列表的第 5 个元素。(如果包括 0、1、2、3、4,则 4 是第 5 个单位)

所以plist!4返回 B。

于 2013-09-18T15:27:02.720 回答
2

列表是归纳数据类型。这意味着在列表上定义的函数——例如,访问第n 个元素——是由递归定义的。您正在寻找的数据结构似乎是一个数组,它允许恒定时间查找。在列表中的索引处查找元素的最简单方法是直接:

lookup :: Int -> [a] -> Maybe [a]
lookup n []     = Nothing
lookup 0 (x:xs) = Just x
lookup n (x:xs) = lookup (n - 1) xs
于 2011-10-29T12:35:20.657 回答
0

列表不是数组。

您只能从 first 开始访问元素。将列表视为流(如收音机中播放的歌曲)。列表可能是无限长的(因为收音机永远不会停止)。

大多数程序员使用“语法”糖,它将列表的本质隐藏在更简单的语法后面。

Miranda 会自动加载一个名为 的默认库stdenv.m,您可以对其进行研究。

现在,让我们考虑一下您的问题:您想忽略(“删除”)第 5 个之前的所有元素,然后从 ramaining 列表的其余部分中获取第一个元素。

这在 Miranda 中表示为:

nth :: num -> [*] -> *
nth n = hd . drop (n-1)

这是一个具有显式类型声明的函数,该函数适用于每个列表(元素是通配符类型*)。

样本:

plist :: [[char]]
plist  = ["A","A","A","A","B","A","A","A","A"]

result :: [char]
result  = nth 5 plist

如果你想用错误处理来编写你的函数,你需要一些技巧来发现你的列表中没有第 5 个元素。

如上所示,一种技术是“也许”。另一个是延续。

一个不好的技术是首先检查列表的长度,因为这会因无限列表而崩溃。

于 2021-09-30T10:39:50.060 回答