【问题标题】:How would I turn this into a tail recursion? Haskell我如何将其变成尾递归?哈斯克尔
【发布时间】:2015-07-17 21:15:13
【问题描述】:

我正在尝试获取列表中元素的索引。

但是我遇到的问题是元素不在列表中。

我在想也许尾递归是有序的,但我不确定如何去做。

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

编辑: 能够让它工作。

【问题讨论】:

  • 您熟悉累加器的概念吗?一个工作函数(通常命名为go)?
  • 我了解累加器的概念,但不了解工作函数。
  • 有什么问题?当元素不在列表中时,您希望发生什么?
  • @KelseyAbreu 通常当某些事情可能失败(例如,找不到元素)时,该函数将返回 Maybe。
  • @KelseyAbreu 如果您回答了自己的问题,您应该发布您发现的答案作为答案,并认为该答案是正确的。 StackOverflow 的目标只是部分回答问题;另一部分是创建一个对未来有类似问题的访问者有用的工件。

标签: haskell tail-recursion


【解决方案1】:

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

import Control.Monad

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

...返回Maybe Int。如果您坚持使用 -1 hack,请在 msum 前面添加 fromMaybe (-1) $(来自 Data.Maybe)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    相关资源
    最近更新 更多