在Haskell中遇到递归和类型不匹配的问题

在Haskell中遇到递归和类型不匹配的问题,haskell,recursion,functional-programming,Haskell,Recursion,Functional Programming,因此,我试图在haskell中创建一个简单的复制函数,它将接受一个泛型a并复制n次。然而,上述措施似乎并不奏效。我一直收到以下错误代码: -- genrep genrep :: a -> Int -> [a] genrep a n | n == 0 = [] |otherwise = a ++ genrep (a (n-1)) 谁能告诉我发生了什么事?该函数在我看来是正确的,但Haskell似乎不喜欢此函数。更改此函数: *** Expression

因此,我试图在haskell中创建一个简单的复制函数,它将接受一个泛型a并复制n次。然而,上述措施似乎并不奏效。我一直收到以下错误代码:

-- genrep
 genrep :: a -> Int -> [a]
 genrep a n 
    | n == 0 = []
    |otherwise = a ++ genrep (a (n-1))
谁能告诉我发生了什么事?该函数在我看来是正确的,但Haskell似乎不喜欢此函数。

更改此函数:

*** Expression     : a ++ genrep (a (n - 1))
*** Term           : genrep (a (n - 1))
*** Type           : Int -> [b]
*** Does not match : [a]
为此:

| otherwise = a ++ genrep (a (n-1))
当前版本只使用一个参数递归调用
genrep
,而它需要两个参数。不需要额外的括号

编辑:我将上面的代码修改为包含
[a]
,而不仅仅是
a
。很抱歉。这就是我建议你做的:

| otherwise = [a] ++ genrep a (n-1)
更改此项:

*** Expression     : a ++ genrep (a (n - 1))
*** Term           : genrep (a (n - 1))
*** Type           : Int -> [b]
*** Does not match : [a]
为此:

| otherwise = a ++ genrep (a (n-1))
当前版本只使用一个参数递归调用
genrep
,而它需要两个参数。不需要额外的括号

编辑:我将上面的代码修改为包含
[a]
,而不仅仅是
a
。很抱歉。这就是我建议你做的:

| otherwise = [a] ++ genrep a (n-1)
你也可以写它:

genrep :: a -> Int -> [a]
genrep a 0 = []
genrep a n = a : genrep a (n-1)
甚至:

genrep :: a -> Int -> [a]
genrep a n = take n (repeat a)
由于复制存在:

如果您不知道它的名称,可以使用以下Hoogle搜索找到它:

通常,您不必手动编写此类递归,您可以重用take或repeat等函数。

您也可以编写它:

genrep :: a -> Int -> [a]
genrep a 0 = []
genrep a n = a : genrep a (n-1)
甚至:

genrep :: a -> Int -> [a]
genrep a n = take n (repeat a)
由于复制存在:

如果您不知道它的名称,可以使用以下Hoogle搜索找到它:


通常您不必手工编写这种递归,您可以重用take或repeat之类的函数。

Hmm。。。那不行。我收到另一个错误,它抱怨无限类型的统一。@Waffles
[a]++
是毫无意义的,只需使用
a:
。第一种方法将单个元素生成一个列表,然后执行两个列表的串联,第二种方法只是将元素合并到现有列表上的列表构造函数。OJ可能使用了第一种形式来接近你已经拥有的。嗯。。。那不行。我收到另一个错误,它抱怨无限类型的统一。@Waffles
[a]++
是毫无意义的,只需使用
a:
。第一种方法将单个元素生成一个列表,然后执行两个列表的串联,第二种方法只是将元素合并到现有列表上的列表构造函数。OJ可能使用了第一种形式来与您已经拥有的非常匹配。