List 哈斯克尔的汉明与列表

List 哈斯克尔的汉明与列表,list,haskell,functional-programming,hamming-numbers,smooth-numbers,List,Haskell,Functional Programming,Hamming Numbers,Smooth Numbers,我想在Haskell中编写一个hamming函数,该函数获取一个列表作为输入。我已经有了这个: merge :: [Integer] -> [Integer] -> [Integer] merge (x:xs)(y:ys) | x == y = x : merge xs ys | x < y = x : merge xs (y:ys) | otherwise = y : merge (x:xs) ys ham

我想在Haskell中编写一个hamming函数,该函数获取一个列表作为输入。我已经有了这个:

    merge :: [Integer] -> [Integer] -> [Integer]
    merge (x:xs)(y:ys)
      | x == y    = x : merge xs ys
      | x <  y    = x : merge xs (y:ys)
      | otherwise = y : merge (x:xs) ys


hamming :: [Integer] 
hamming 
  = 1 : merge (map (2*) hamming) (merge (map (3*) hamming) (map (5*) hamming))
merge::[Integer]->[Integer]->[Integer]
合并(x:xs)(y:ys)
|x==y=x:合并xs-ys
|x
那很容易。但是现在我想要像“hamming[4,6,7,9]”这样的东西作为输入。实际输入是1,但现在输入应该是一个列表,列表中的每个数字都在汉明列表中。当然,2x3x和5x也在列表中

我写了这样的东西

“hamming(x:xs)=x:merge(map(2*)hamming)(merge(map(3*)hamming)(map(5*)hamming))”
只是用一个列表进行测试,但它不起作用。

尽管这是一个问题,但我将向您展示如何找到解决方案。在复制品上出现的;在这里,我将更多地关注一次旅行,而不是它的目的地。你试过了

hamming (x:xs)
    = 1 : merge (map (2*) hamming) (merge (map (3*) hamming) (map (5*) hamming))
这是怎么回事?它是一个函数吗?名单?这里乱七八糟;一团糟。你想把你的列表定义变成一个函数,把它叫做
hamming[2,3,5]
,比方说;但是,
map
表达式中应该包含什么呢?函数调用,
hamming[2,3,5]

但这会破坏目的,因为我们在这里明确地在几个不同的地方使用相同的列表,即三个(或更多…<代码>映射映射),每个映射都保持其自己指向共享序列的指针。并且进行单独的函数调用,即使是等价的,也会(最有可能而且几乎肯定地)产生三个单独的、即使相等的列表。这并不是我们在这里所需要的(这实际上是一个有趣的练习;尝试一下,看看这个函数会变得多么慢和内存匮乏)

所以,分开你的顾虑!首先将其重新写入为(仍然无效)

现在,
h
是共享列表,您可以自由地创建您的函数,
hamming
,无论您希望它是什么,即

hamming :: [Integer] -> [Integer] 
hamming [2,3,5] = h where
   h = 1 : merge (map (2*) h) (merge (map (3*) h) (map (5*) h))
     = 1 : merge (map (2*) h) (merge (map (3*) h) (merge (map (5*) h) []))
就是

     = 1 : foldr merge [] [map (p*) h | p <- [2,3,5]]
这就是你的答案,对参数进行一些普通的重命名

不要忘记将您的
merge
函数重命名为
union
,因为“merge”不应该跳过重复项,这让人联想到mergesort。并在文件中保持所有定义从同一缩进级别开始。

映射(3*)汉明应该做什么?你想把一个函数的元素(?!)乘以三?
     = 1 : foldr merge [] [map (p*) h | p <- [2,3,5]]
       g a (g b (g c (... (g n z) ...)))
     =
       foldr g z [a,b,c,...,n]