Haskell 如何将其转换为尾部递归?哈斯克尔

Haskell 如何将其转换为尾部递归?哈斯克尔,haskell,tail-recursion,Haskell,Tail Recursion,我试图获取列表中元素的索引 然而,我遇到的问题是当元素不在列表中时 我想也许尾部递归是正确的,但我不确定该怎么做 whatIndex sought [] = -1 whatIndex sought (a:xs) = if sought == a then 0 else 1 + whatIndex sought xs 编辑: 当它不在列表中时,它应该返回-1 例如: whatIndex 3 [1,2,3] == 2 whatIndex 3 [0,1,2]

我试图获取列表中元素的索引

然而,我遇到的问题是当元素不在列表中时

我想也许尾部递归是正确的,但我不确定该怎么做

whatIndex sought [] = -1
whatIndex sought (a:xs) = 
    if sought == a
        then 0
        else 1 + whatIndex sought xs
编辑:

当它不在列表中时,它应该返回-1

例如:

whatIndex 3 [1,2,3] == 2
whatIndex 3 [0,1,2] == -1
编辑:
能够让它工作。

当然你有
数据。List.findIndex
。如果你想自己写,有很多方法,例如:

import Control.Monad

whatIndex x = msum . zipWith f [0..] where
  f i y = if x == y then Just i else Nothing

。。。它返回一个
可能是Int
。如果您坚持使用-1 hack,请在
msum
前面添加
fromaybe(-1)$
(它来自
数据。Maybe
)您熟悉累加器的概念吗?辅助函数(通常称为
go
)?我理解累加器的概念,但不是辅助函数。问题是什么?当元素不在列表中时,您希望发生什么情况?@KelseyAbreu通常在某些事情可能失败时(例如,未找到元素),函数可能会返回。@KelseyAbreu如果您回答了自己的问题,您应该将发现的作为答案发布,并接受正确的答案。StackOverflow的目标只是部分地回答问题;另一部分是创建一个工件,该工件对于将来有类似问题的访问者非常有用。