Haskell-在列表中查找元素并返回其位置

lop*_*304 5 indexing haskell list fibonacci maybe

所以我需要将一个函数描述为

invFib :: Integer -> Maybe Integer
Run Code Online (Sandbox Code Playgroud)

取一个整数并在斐波那契序列中查找它(如下面的函数所述)

fibs :: [Integer]
fibs = 0:1:(zipWith (+) fibs (tail fibs)) 
Run Code Online (Sandbox Code Playgroud)

并返回数字示例的索引:

invFib 0 〜> Just 0

invFib 1〜> Just 1Just 2

map invFib [54, 55, 56] 〜> [Nothing,Just 10,Nothing]

invFib (fibs !! 99) 〜> Just 99

我尝试创建一个函数,它获取整数列表并吐出索引,但它仍然失败.有什么想法吗?

这是我试过的功能 -

findNum :: [Integer] -> Integer -> Integer -> Integer
findNum x:xs y z = if x == y
                then z
                else findNum xs y (z+1)
Run Code Online (Sandbox Code Playgroud)

编辑:该函数冻结不在斐波那契序列中的数字,也只在输入1时显示1个值

invFib :: Integer -> Maybe Integer
invFib n = if n < 0
        then Nothing
        else fmap fromIntegral (elemIndex n fibs)
Run Code Online (Sandbox Code Playgroud)

Mtn*_*ark 8

所以关键在于它fibs是无限的,但也是单调增加的.因此,一旦超过所寻找的数量,它就可以返回Nothing:

findIndexInAscendingList :: (Ord a) => a -> [a] -> Maybe Integer
findIndexInAscendingList a xs = find 0 xs
  where
    find i [] = Nothing -- won't get used for fibs
    find i (x:xs) | a == x    = Just i
                  | a < x     = Nothing
                  | otherwise = find (i + 1) xs

invFib :: Integer -> Maybe Integer
invFib n = findIndexInAscendingList n fibs
Run Code Online (Sandbox Code Playgroud)

所以:

$ ghci
GHCi, version 7.4.2: http://www.haskell.org/ghc/  :? for help
?: :load Fib.hs 
[1 of 1] Compiling Main             ( Fib.hs, interpreted )
Ok, modules loaded: Main.
?: map invFib [54,55,56]
[Nothing,Just 10,Nothing]
Run Code Online (Sandbox Code Playgroud)

还有其他一些方法可以做到这一点.考虑zip fibs [0..]然后你可以dropWhile用来删除少于的部分n并测试剩下的部分.


גלע*_*רקן 7

为什么不使用像'takeWhile'这样的函数来返回你要检查的无限'fibs'列表的一部分?使用有限列表,您可以应用像'elemIndex'这样的函数,通过一些类型调整,可以返回您所追求的内容.

elemIndex myInteger (takeWhile (<= myInteger) fibs)
Run Code Online (Sandbox Code Playgroud)