Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List Haskell中长度函数的问题_List_Haskell_Recursion_Integer - Fatal编程技术网

List Haskell中长度函数的问题

List Haskell中长度函数的问题,list,haskell,recursion,integer,List,Haskell,Recursion,Integer,我正在尝试用Haskell编写一个函数,它将获取整数列表,例如[1,2,3,4,5],并使用递归将它们转换为数字,例如12345。我使用Haskell标准库中的length函数来计算数字的位置,这样它们就可以相加(10000+2000+300+40+5)。但是,当我使用length来计算列表的长度时,无论发生什么情况,它总是1,我不知道为什么。这是我的密码: dig :: [Integer] -> Integer dig [] = 0 dig (x:xs) = x * (10^(fromI

我正在尝试用Haskell编写一个函数,它将获取整数列表,例如[1,2,3,4,5],并使用递归将它们转换为数字,例如12345。我使用Haskell标准库中的length函数来计算数字的位置,这样它们就可以相加(10000+2000+300+40+5)。但是,当我使用length来计算列表的长度时,无论发生什么情况,它总是1,我不知道为什么。这是我的密码:

dig :: [Integer] -> Integer
dig [] = 0
dig (x:xs) = x * (10^(fromIntegral(length[xs]))) + fromDigits(xs)

运行此代码总是将数字乘以10,长度总是1,因此dig[1,2,3,4]给出的是100而不是1234。

使用
[xs]
将xs放入一个新的单元素列表中,因此长度是1

只需使用
length xs
即可

更简单的方法是将每个递归步骤的累积结果乘以10:

dig :: [Integer] -> Integer
dig = foldl' (\a e -> 10 * a + e) 0

我把这个问题和一个老问题联系起来,这个问题解决了这里的主要问题,只是为了交叉引用。编译器如何知道数组中的元素a和e?这是无点速记吗?@wide_-eyed_-poud检查
foldl'的类型:(a->b->a)->a->[b]->a
,它使用一个函数,将
a
类型的累加器和
b
类型数组的值组合起来,并生成一个新的
a