gpt4 book ai didi

haskell - 在 Haskell 中的列表末尾添加一个元素

转载 作者:行者123 更新时间:2023-12-03 23:38:08 28 4
gpt4 key购买 nike

我是 Haskell 的初学者,我正在尝试在列表的末尾添加一个元素。

我输入一个像 [1,2,3,4] 的列表和一个数字 10。我想要一个像 [1,2,3,4,10] 这样的输出。

我的代码:

func a [] = a
func a (x:xs) = x : func a (x:xs)

但我收到了那个错误:
Non type-variable argument in the constraint: Num [a]
(Use FlexibleContexts to permit this)
When checking that ‘it’ has the inferred type
it :: forall a. (Num a, Num [a]) => [a]

谁能帮忙解释一下?

最佳答案

您需要了解等号左侧的函数定义所发生的情况是“模式匹配”。

通过以下声明,您基本上是在说

func a [] = a
...

我想首先接受任何类型的元素,即 a , 作为第一个参数,一个空列表作为第二个参数,即 [] .如果是这种情况,您要返回 a .问题是,你想返回一个列表 [a] (稍后您将在此答案中看到原因)。

对于函数定义的第二部分(这意味着第一个“模式”与您的输入不匹配),您是在说:我接受任何类型的元素,即 a ,以及一个非空列表,即 (x:xs) . (x:xs)是一种说法:好的,我有一个列表和 x是该列表的第一个元素。我调用列表的其余部分 xs , 可能是空的;在这种情况下,您的原始列表将是大小为 1 的列表,即只是 [x] .
...
func a (x:xs) = x : func a (x:xs)

如果模式匹配,您返回的内容是
... = x : func a (x:xs)

这意味着您将列表的第一个元素作为第二个参数传递(即 x )并将其附加到 func a (x:xs) 的结果中.

鉴于您的问题的这种描述,这里有一个可能的解决方案:
func a [] = [a]
func a (x:xs) = x : func a xs

我想在这里说明两件事。在第一个模式中,即 func a [] = [a] , 我返回一个列表,即 [a] .在第二个模式中,我通过 xsfunc , 即 func a xs .在这两种情况下,我都会返回一个列表!

为什么这样做?让我们看一个例子。假设您调用 func喜欢 func 3 [1, 2] .那么这就是会发生的事情。

[1, 2]不是空列表,您不匹配第一个模式,所以让我们看看第二个;是的,我们与第二场比赛。现在我们有了 a = 3 , x = 1 (列表的开头)和 xs = [2] .所以我们有 1 : func 3 [2] .所以我们递归!我们现在有 a = 3 (和之前一样), x = 2xs = [] (即空列表)。所以我们继续函数体,我们做 2 : func 3 [] .最后, func 3 []匹配第一个模式,然后返回 [3] .但是为了什么?嗯,到 2 : [3] ,返回到什么?致 1 : 2 : [3] .

关于haskell - 在 Haskell 中的列表末尾添加一个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42798257/

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