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