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
因此,避免使用两个参数。第二种风格通常被认为更地道。不过,我不确定最后一句话。尾部递归版本(具有适当的严格性修复,或由优化器修复)在恒定空间中运行(前提是数字为标准类型),而非尾部递归版本使用线性内存。我会用第一个版本,但我不确定最后一句话。尾部递归版本(具有适当的严格性修复,或由优化器修复)在恒定空间中运行(前提是数字为标准类型),而非尾部递归版本使用线性内存。我会使用第一个版本。