gpt4 book ai didi

list - 试图让我的头(x :xs) and lists?

转载 作者:行者123 更新时间:2023-12-02 05:53:44 25 4
gpt4 key购买 nike

我一直对列表的工作方式感到困惑,并且对整个 (x:xs) 概念感到困惑。我只是似乎没有理会它。

例子

select :: Ord a => a -> [a] -> [a]
select y [] = []
select y (x:xs)
| x < y = x : select y xs
| otherwise = select y xs

附言我确切地知道该函数的作用,但是谁能解释这个过程(尤其是奇怪的 Ord a=> 标志)?

任何有效的策略将不胜感激。

提前致谢。伊恩。

最佳答案

好的。让我们来看看这里的不同句法元素。

第 1 行

select :: Ord a => a -> [a] -> [a]

这是一个类型声明。它是一个函数的声明(因为它有 -> 类型)。

该函数有两个参数。

  • 第一个是任何类型的单个值,由 a 表示(小写表示它是多态类型)。
  • 第二个参数是与第一个参数相同的任何类型的列表。

返回值是任意类型的列表,与参数类型相同。

Ord a 组件是一个类型类约束,表示此函数给出的任何类型也必须是 Ord 类的实例。这是一类可以比较的类型。

第 2 行

现在我们看第 2 行:

select y [] = []

这是 select 函数本身的一个定义。它非常简单,包含两个参数的模式和结果规范。内容如下:

if the first argument is any value (which we will name y), and the second argument is the empty list (denoted by the [] pattern), then select evaluates to the empty list.

第 3 行

第 3 行包含列表的另一种情况:

select y (x:xs)

同样,这是 select 函数定义的一部分,适用于第二个参数不是空列表的情况。如果它不是一个空列表,那么它就是一个有头部 x 和尾部 xs 的列表。 “cons”构造函数 (:) 结合了列表头和尾。这也是我们在列表上进行模式匹配以提取头部和尾部的方式。

通过在列表的头部和尾部进行模式匹配,使用 (x:xs),我们将一个新变量 x 绑定(bind)到头部的值列表的值,xs 为列表尾部的值。

第 4 行和第 5 行

如果第二个参数是非空列表,最后两行是额外的守卫,它们根据额外的检查进行测试和分支:

| x < y     = x : select y xs
| otherwise = select y xs

x 小于第一个参数 y 时,第一个守卫触发。如果是这样,我们将返回一个新列表,其中 x 位于头部,select 再次应用于尾部。

如果不是这种情况,那么我们从列表中删除 x,并只返回递归调用 tail 时发生的情况。


有关 Haskell 如何工作的更多信息,我推荐介绍性文本,例如:

这将是值得你花时间的。

关于list - 试图让我的头(x :xs) and lists?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5875067/

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