在Haskell中遇到递归和类型不匹配的问题
因此,我试图在haskell中创建一个简单的复制函数,它将接受一个泛型a并复制n次。然而,上述措施似乎并不奏效。我一直收到以下错误代码:在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
-- 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可能使用了第一种形式来与您已经拥有的非常匹配。