Haskell作业 - 十进制列表[Int] - >诠释

时间:2013-09-27 10:33:31

标签: haskell fold

赋值是定义函数decimal :: [Int] -> Int,其中正整数列表是给出十进制数Sigma function,以便列表[1,4,3,1,9]返回Integer 14319.我将使用fold函数。

我真的没有好主意从这里开始,所以我只需要朝着正确的方向努力,但我正在考虑Horner计划。谢谢!

4 个答案:

答案 0 :(得分:4)

在折叠中,您从左侧开始向右侧移动。当您使用列表中的下一个元素时,您将已有的元素乘以10并将新元素添加到该元素。

因此,如果您使用0对foldl进行种子处理并且具有[1,2,3],则您的函数会将当前(0)乘以10(也为0),然后再添加1.继续,将当前(1)乘以10(得到10)并加2(12)。最后为3,12 * 10 = 120,120 + 3 = 123。

这应该很容易编码:)

答案 1 :(得分:3)

也许这个等式可以指导你。

S_n = \sum_{k=0}^n x_k 10^{n-k} = \sum_{k=0}^{n-1} x_k 10^{n-k} + x_n = 10\sum_{k=0}^{n-1} x_k 10^{(n-1)-k} + x_n = 10S_{n-1} + x_n

答案 2 :(得分:1)

由于这是一个家庭作业,让我们停止建议您将此表达式扩展为某个列表,并尝试提取经常性关系:

x_0 * 10 ^ n + x_1 * 10 ^(n-1)+ ... + x_n * 10 ^ 0 =(((x_0 * 10 + x_1)* 10 + x_2)...)* 10+ x_n

如果将此与折叠进行比较,您将看到一个折叠与此模式匹配两个参数的特定函数。

答案 3 :(得分:-3)

这是我的变种

import Data.List
decimal :: [Int] -> Int
decimal xs = foldl' (\sum (pos,x) -> (sum + x*(10^(l-pos)))) 0 $ zip [1..] xs where
            l = length xs


*Main> decimal [1,4,3,1,9]
14319

Haskell中,你有非常强大的武器 - 列表处理功能。其中一项功能是foldl(我们使用严格版本的foldlfoldl')它的类型

foldl :: (a -> b -> a) -> a -> [b] -> a

这个函数接受三个参数,一个累积的agrument,一个处理的列表,以及最感兴趣的, 使用accumulator和list元素执行任何操作并返回结果的函数。折叠是非常重要的功能,因此您应该阅读有关它的详细信息{。3}} 但是,有一个问题,我们有三个变量我们的等式:列表元素处理(x),总列表长度(n)和处理元素的位置(k)。但是我们只能遍历foldl一个元素。 我们如何遍历每个元素的位置?让我们从Int形成元组,其中第一个元素是一个位置,第二个元素是一个值。这是一个标准技巧,zip函数可以帮助我们:

zip [1..] [1,4,3,4,6]
[(1,1),(2,4),(3,3),(4,4),(5,6)]

我们将元组列表传递给foldl函数,foldl为列表的每个元素调用lambda function (\sum (pos,x) -> (sum + x*(10^(l-pos)))),将结果汇总到sum < / p>