在Haskell中实现indexOf

kos*_*tmo 1 haskell pattern-matching

我将通过Learn You a Haskell教程并尝试elem'Recursion部分修改该函数.

原来的elem'功能是:

elem' :: (Eq a) => a -> [a] -> Bool
elem' a [] = False
elem' a (x:xs)
    | a == x    = True
    | otherwise = a `elem'` xs
Run Code Online (Sandbox Code Playgroud)

我的indexOf功能是:

indexOf :: (Eq a, Integral s) => a -> [a] -> s -> s
indexOf _ [] _ = -1
indexOf a (x:xs) s
    | a == x    = s
    | otherwise = indexOf a xs s+1
Run Code Online (Sandbox Code Playgroud)

该函数应该返回列表中元素的索引,或者-1是否找不到该元素.

在我的.hs文件的末尾,我用以下方法测试函数:

main = putStrLn(show(indexOf 7 [1,2,3] 0))
Run Code Online (Sandbox Code Playgroud)

该函数可正常用于查找列表中显示的值.但是,对于上面所写的测试-1,它不会返回,而是打印2.返回值似乎总是列表长度减去1.

在遇到边缘条件(空列表)之后,我希望-1返回值一直向上传播通过调用堆栈.哪里是我的错?

GS *_*ica 5

你有一个优先问题.函数应用程序绑定比绑定更紧密(+),因此otherwise案例被解析为(index' a xs s) + 1.