有没有简单的方法来浏览列表?假设我想访问列表中的第 5 个数据,但不知道它是 B
["A","A","A","A","B","A","A","A","A"]
有没有办法我可以做到这一点而不必对列表进行排序?
有没有简单的方法来浏览列表?假设我想访问列表中的第 5 个数据,但不知道它是 B
["A","A","A","A","B","A","A","A","A"]
有没有办法我可以做到这一点而不必对列表进行排序?
我不太了解 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)
另一种方法是使用 ! 操作员。假设您有一个程序在列表中定义了数据,例如:
plist = [A,A,A,A,B,A,A,A,A]
然后执行plist!4
将为您提供该列表的第 5 个元素。(如果包括 0、1、2、3、4,则 4 是第 5 个单位)
所以plist!4
返回 B。
列表是归纳数据类型。这意味着在列表上定义的函数——例如,访问第n 个元素——是由递归定义的。您正在寻找的数据结构似乎是一个数组,它允许恒定时间查找。在列表中的索引处查找元素的最简单方法是直接:
lookup :: Int -> [a] -> Maybe [a]
lookup n [] = Nothing
lookup 0 (x:xs) = Just x
lookup n (x:xs) = lookup (n - 1) xs
列表不是数组。
您只能从 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 个元素。
如上所示,一种技术是“也许”。另一个是延续。
一个不好的技术是首先检查列表的长度,因为这会因无限列表而崩溃。