2011-03-17 54 views
0
-- genrep 
genrep :: a -> Int -> [a] 
genrep a n 
    | n == 0 = [] 
    |otherwise = a ++ genrep (a (n-1)) 

所以我试图在哈斯克尔简单的复制功能 - 一个将采取泛型类型和复制了N次。但是,上述似乎并不奏效。我一直得到这个错误代码:有递归的麻烦和不匹配型哈斯克尔

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

谁能告诉我发生了什么事?该函数看起来对我来说是正确的,但Haskell似乎并不喜欢这样。

回答

4

更改此:

| otherwise = a ++ genrep (a (n-1)) 

这样:

| otherwise = [a] ++ genrep a (n-1) 

您当前的版本调用genrep递归只有一个参数时,它需要两个。额外的括号不是必需的。

编辑:我修正了上面的代码,包括[a]而不是只有a。对于那个很抱歉。其实,这是我会建议你做:由于存在重复

genrep = flip replicate 

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

嗯......这不起作用。我得到另一个错误,抱怨与这种无限类型的统一。 – Waffles 2011-03-17 06:37:47

+0

编辑我的回复。 – 2011-03-17 06:42:01

+0

@Waffles'[a] ++'是相当无意义的,只需使用'a:'。第一个将单个元素放入一个列表中,然后执行两个列表的连接,第二个只是将元素放入现有列表的列表构造函数。 OJ可能使用了第一种形式来紧密匹配你已有的东西。 – 2011-03-17 16:00:17