List Haskell使用单个输入创建计数器

List Haskell使用单个输入创建计数器,list,haskell,recursion,List,Haskell,Recursion,我是一个初学者,我想定义一个函数来显示一个列表中有多少个元素。我已经创建了这个: elementsl n [] = n elementsl n (_:xs) = elementsl (n+1) xs 但是我需要给出两个输入:0和一个列表。 如何仅将列表作为单个输入而在函数中仍有一个计数器?非常简单,定义一个新函数,并在中定义“helper”函数,其中块: elements ls = helper 0 ls --`helper' is your previous function, de

我是一个初学者,我想定义一个函数来显示一个列表中有多少个元素。我已经创建了这个:

elementsl n []     = n
elementsl n (_:xs) = elementsl (n+1) xs
但是我需要给出两个输入:
0
和一个列表。
如何仅将列表作为单个输入而在函数中仍有一个计数器?

非常简单,定义一个新函数,并在
中定义“helper”函数,其中
块:

elements ls = helper 0 ls --`helper' is your previous function, defined below:
    where helper n []     = n
          helper n (_:xs) = helper (1+n) xs
这将防止在其他地方使用
helper
,但允许您以这种方式编写函数

但是,您可以完全避免这种尾部递归,只需编写:

elements []     = 0
elements (_:xs) = 1 + elements xs

因此,避免使用两个参数。第二种风格通常被认为更为惯用的haskell。

非常简单,定义一个新函数,并在
块中定义“helper”函数,其中
块:

elements ls = helper 0 ls --`helper' is your previous function, defined below:
    where helper n []     = n
          helper n (_:xs) = helper (1+n) xs
这将防止在其他地方使用
helper
,但允许您以这种方式编写函数

但是,您可以完全避免这种尾部递归,只需编写:

elements []     = 0
elements (_:xs) = 1 + elements xs

因此,避免使用两个参数。第二种风格通常被认为更地道。

不过,我不确定最后一句话。尾部递归版本(具有适当的严格性修复,或由优化器修复)在恒定空间中运行(前提是数字为标准类型),而非尾部递归版本使用线性内存。我会用第一个版本,但我不确定最后一句话。尾部递归版本(具有适当的严格性修复,或由优化器修复)在恒定空间中运行(前提是数字为标准类型),而非尾部递归版本使用线性内存。我会使用第一个版本。