嗨,我是haskell的新手,我有一个程序
double x = case x of
[] -> []
x:xs -> (if (x*2 < 10) then [x*2] else [x*2 `div` 10 + x*2 `mod` 10]) ++ double xs
我遇到的问题是我想总结这个函数给出的答案,并将数字乘以7.
所以,如果我输入双倍[1,2,3,4,5]
我会得到[2,2,6,4,1]现在我想把它记在另一个函数中并将它们加在一起并乘以9.我知道你可以使用 $ 来附加功能,但我不知道我会怎么做。感谢
答案 0 :(得分:1)
我不确定double [1,2,3,4,5]
将如何[2,2,6,4,1]
。当我运行您的代码时,我得到[2,4,6,8,1]
。
另外,你想要乘以9还是9? (我将在帖子的其余部分假设7。)
您可以像这样使用$
:
anotherFunction xs = sum xs * 7
double' x = anotherFunction $ double x
但如果你使用.
来撰写你的函数会更好:
double'' = anotherFunction . double
尝试一下,让我知道它是否符合您的要求!
答案 1 :(得分:0)
首先,我建议你在这里使用map
,而不是自己编写递归函数。很明显,对于元素列表,您生成一个相同长度的列表,您可以将每个元素映射到另一个元素。这里“映射函数”的结构如下:
f x | tx >= 10 = mod tx 10 + div tx 10
| otherwise = tx
where tx = 2*x
甚至更紧凑:
f x = let tx = 2*x in min tx (mod tx 10 + div tx 10)
现在您的double
功能可以表示为:
double :: Integral i => [i] -> i
double = map f
where f x = let tx = 2*x in min tx (mod tx 10 + div tx 10)
现在它产生:
Prelude> double [1..5]
[2,4,6,8,1]
根据您的规格,这是正确的。在问题中提出建议列表的唯一合理方法是仅处理具有奇数索引的值(所以第一,第三,第五等)。
然而,问题的核心是后处理。我们可以使用(.) :: (b -> c) -> (a -> b) -> a -> c
函数:
sum7 :: Integral i => [i] -> i
sum7 = (7*) . sum . double
因此,对于您的输入,这会产生:
Prelude> sum7 [1,2,3,4,5]
147