首页 > 解决方案 > 确定元素在列表中的位置的递归 Haskell 函数

问题描述

我有这段代码将返回 char 数组中 char 的索引,但如果该值不在数组中,我希望我的函数返回类似 -1 的内容。就目前而言,如果元素不在数组中,则函数返回数组的大小。关于如何更改我的代码以应用此功能的任何想法?

我试图不使用任何花哨的功能来做到这一点。我只想要没有内置函数的简单代码。

isPartOf :: [(Char)] -> (Char) -> Int
isPartOf [] a = 0
isPartOf (a:b) c
    | a == c = 0
    | otherwise = 1 + isPartOf b c

例如:

*Main> isPartOf [('a'),('b'),('c')] ('z') 
3

但我想要:

*Main> isPartOf [('a'),('b'),('c')] ('z') 
-1

标签: haskellrecursion

解决方案


让我们尝试定义这样一个函数,但是-1如果元素不是列表的一部分,我们可以返回,而不是返回Nothing

isPartOf :: Eq a => [a] -> a -> Maybe Int
isPartOf [] _ = Nothing
isPartOf (x : xs) a | x == a = Just 0
                     | otherwise = fmap ((+) 1) (isPartOf xs a)

所以,它是这样工作的:

>> isPartOf [('a'),('b'),('c')] ('z')
Nothing
it :: Maybe Int

>> isPartOf [('a'),('b'),('c')] ('c')
Just 2
it :: Maybe Int

之后,我们可以使用内置函数fromMaybeNothing大小写转换为-1

>> fromMaybe (-1) $ isPartOf [('a'),('b'),('c')] ('c')
2
it :: Int

>> fromMaybe (-1) $ isPartOf [('a'),('b'),('c')] ('z')
-1
it :: Int

如果您对这样的功能已经存在感到好奇,您可以使用 Hoogle,搜索[a] -> a -> Maybe Int功能:https ://www.haskell.org/hoogle/?hoogle=%5Ba%5D+-%3E+a+-% 3E+也许+智力

第一个答案是elemIndex

>> elemIndex 'c' [('a'),('b'),('c')]
Just 2
it :: Maybe Int

>> elemIndex 'z' [('a'),('b'),('c')]
Nothing
it :: Maybe Int

希望这可以帮助。


推荐阅读