从先前输出中获取值的函数

时间:2018-04-17 01:50:27

标签: haskell

嗨,我是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.我知道你可以使用 $ 来附加功能,但我不知道我会怎么做。感谢

2 个答案:

答案 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