我开始研究Haskell为下学期做好准备(事实上,我在上学期早些时候放弃了它)并且我已经成功地编写了一些基本功能。我实际上正在审查的主题是列表,我需要帮助来编写一个非常简单的函数,称为cons8,它接受一个列表的参数,并在这样的列表的开头添加(cons)8。我的问题是我被困在如何将列表作为函数的参数以及如何在函数体中引用它。我想我可以按如下方式定义类型,然后编写函数:
cons8 :: [a] -> [a]
非常感谢您帮助解决我的问题。
答案 0 :(得分:6)
首先,从类型开始确实是一个很好的开始方式。
让我们检查一下类型:
cons8 :: [a] -> [a]
此处,a
可以是任何类型。上面的类型承诺调用者可以将cons8
与任何列表一起使用:整数列表,字符列表,布尔列表等等。因为我们想要前置8,并且列表包含相同类型的值,我们可以看到上面的类型太笼统了。让我们使用一些不太通用的东西,例如
cons8 :: [Int] -> [Int]
现在,如何获取列表参数。这很重要:你将list参数作为任何其他参数。
cons8 x = ???? -- TODO
这里常见的错误是写cons8 [n] = ...
,因为它是一个列表。别这么做! [n]
是一个列表,但却是一个非常特殊的列表:只包含一个元素的列表(n
)。我们不想只处理单元素列表,我们希望cons8
能够使用任何列表。所以,没有大括号:让x
成为整个列表参数。
然后,我们可以应用cons运算符:
cons8 x = 8 : x
当然,我们可以将x
重命名为任何其他名称,例如
cons8 list = 8 : list
也可以。
当您在Haskell中取得领先时,您可能会了解各个部分,并且更喜欢以下代码
cons8 = (8 :)
实际上,(8 :)
非常短,您通常会避免定义cons8
函数,并直接使用其定义。