【发布时间】:2012-07-26 12:31:08
【问题描述】:
我正在尝试在 haskell 中生成汉明数,问题是我的输出列表中有重复的 #,我无法弄清楚究竟是为什么。我应该只创建一个删除重复项功能还是只是缺少一些简单的东西?
另外,在函数 hamming 中,我想确保输入列表的大小正好是 3,如何找到列表的大小以便进行比较?
{- Merge lists x&y of possibly infinite lengths -}
merge [] [] = []
merge [] ys = ys
merge xs [] = xs
merge xs ys = min x y : if x < y then merge (tail xs) ys
else merge xs (tail ys)
where x = head xs
y = head ys
{- multiply each element in y by x -}
times x [] = []
times x y = x * (head y) : times x (tail y)
{- find the hamming numbers of the input primes list -}
ham [] = []
ham x = 1 : merge (times (head x) (ham x))
(merge (times (x !! 1) (ham x)) (times (last x) (ham x)))
{- returns x hamming #'s based on y primes of size 3 -}
hamming x [] = []
hamming x y = take x (ham y)
{- hamming x y = if "y.size = 3" then take x (ham y)
else "Must supply 3 primes in input list" -}
【问题讨论】:
-
巧合的是,
nodups xs = map head (Data.List.group xs)用于有序的非递减列表。
标签: haskell hamming-numbers smooth-numbers