给定两个列表,第二个是正整数,重复第一个列出第二个列表中具有相应数字的字符

时间:2016-12-28 13:14:54

标签: list haskell

尝试创建一个包含两个列表的函数,第一个是字符列表,第二个是正整数。然后,该函数重复第一个列表中的字符,即第二个列表中相同位置编号的次数。例如:

mess.hs:10:43: error:

* Couldn't match expected type `Bool' with actual type `[Char]'
* In the second argument of `(&&)', namely `myCount xs ys'
      In the expression: replicate y x && myCount xs ys
      In an equation for `myCount':
          myCount (x : xs) (y : ys) = replicate y x && myCount xs ys

到目前为止我所拥有的:

CREATE TABLE

我正在复制第一个列表中的字符(x)y次,然后递归地为整个列表执行此操作。 任何正确方向的帮助或指示都会很棒!

我的错误是:

sql = """create table Product
        (ProductID integer,
        Name text,
        Price real,
        primary key(ProductID))"""

1 个答案:

答案 0 :(得分:3)

您是如何想出使用&&的?这是一个逻辑运算符,即只有当双方都为真时,它才会将两个真值(Bool)组合成True的值。

你正在处理的不是布尔值而是列表。您希望将两个列表组合到以第一个开头并继续另一个的列表中。 IOW,你想要一个类型为[Char] -> [Char] -> [Char]的函数。实际上列表元素是Char s并不重要,这应该适用于包含任何类型的列表:[a] -> [a] -> [a]。好吧,你可以hoogle thatfirst result

(++) :: [a] -> [a] -> [a]                     infixr 5

     Append two lists, i.e.,

     [x1, ..., xm] ++ [y1, ..., yn] == [x1, ..., xm, y1, ..., yn]
     [x1, ..., xm] ++ [y1, ...] == [x1, ..., xm, y1, ...]

     If the first list is not finite, the result is the first list.

听起来不错,不是吗?所以,这是你要写的功能:

replicates :: [Int] -> [a] -> [a]
replicates (n:ns) (x:xs) =  replicate n x ++ replicates ns xs
replicates _ _ = []

或者,您可以将其定义为

replicates ns = concat . zipWith replicate ns