通过递归Haskell查找数组的第二个元素

时间:2018-12-05 01:29:27

标签: haskell

我编写了以下代码,该代码返回列表的第二个元素。

first :: [Int] -> Int
first []= 0                                                                                                                                        
first [x] =x
first (x:x1:xs) = x1

它工作正常,但我希望它可以进行递归操作,例如,只要列表达到第二个数字,它就会给出第二个数字,因此我会继续递归列表。

非常感谢您。

2 个答案:

答案 0 :(得分:3)

好问题!通过递归执行此操作的典型方法是使用带有额外参数(通常称为for ev in events: event_detail = re.search(r'(?<=\d\s\(\w{3}\)).*(?=\d{2}00)', ev) print(event_detail))的递归函数将函数转换为精简包装:

go

但是,Haskell使用currying,因此first :: [Int] -> Int first list = go 0 list where go 1 (x:_) = x go curIndex (x:xs) = go (curIndex+1) xs go _ [] = 0 的定义可以稍微简化为first

我建议的另一个更改是使用前奏中的first = go 0类型:

Maybe

也就是说,类型data Maybe a = Just a | Nothing 的值可以是包含Maybe Int的{​​{1}}值,也可以是不包含{{1} }。通常,此类型用于计算可能成功或失败的情况,例如该函数!因此,现在可以将其更改为以下内容:

Just

现在,我们可以更改类型,使其更通用(并稍微缩短名称Int),以给出最终的递归答案。我还将名称更改为Nothing,因为该名称更好地反映了函数的用途(毕竟,您会得到 second 元素):

Int

答案 1 :(得分:1)

这并不是真正的“自然”递归案例,但是如果您绝对想要递归,则可以编写此代码...

c:\windows\microsoft.net\framework\v4.0.30319\msbuild.exe YourProject.proj /target:rebuild "/property:Configuration=Debug