Haskell MaybeInt对elemIndex的查询

Haskell MaybeInt对elemIndex的查询,haskell,Haskell,我有以下功能 eC :: Char -> [Char] -> Char eC x z = z !! elemIndex x cA 其中cA是字符列表 然而,我得到了回报 Type error in application *** Expression : z !! elemIndex x cA *** Term : elemIndex x cA *** Type : Maybe Int *** Does not match : Int

我有以下功能

eC :: Char -> [Char] -> Char
eC x z = z !! elemIndex x cA
其中cA是字符列表

然而,我得到了回报

Type error in application
*** Expression     : z !! elemIndex x cA
*** Term           : elemIndex x cA
*** Type           : Maybe Int
*** Does not match : Int

我真的不明白这意味着什么。。。有人能帮忙吗?

这意味着
elemIndex
返回
Maybe Int
,但不能使用
Maybe Int
作为
中的索引

我相信这个问题可以更简单地解决。我建议查看
zip
find


编辑:噢,
zip
lookup
在这种情况下更加简单。

elemIndex
可能会失败,毕竟元素可能不在列表中。这种故障模式应该是您的最终类型(除非您以某种方式处理)

然后你可以传播失败

eC x z = case elemIndex x cA of
  Nothing -> Nothing
  Just ix -> Just (z !! ix)
尽管值得注意的是,
(!!)
将在出现越界错误时抛出不可跟踪的异常。您可能也希望通过组合错误来捕捉到这一点

eC x z = case elemIndex x cA of
  Nothing -> Nothing
  Just ix -> index z ix   -- index returns values wrapped in Maybe
通过使用
Maybe
Monad
实例,您可以更简单地做到这一点

eC x z = do ix <- elemIndex x cA
            index z ix

您也可以只使用
Functor

eC :: Char -> [Char] -> Maybe Char
eC x z = (z !!) `fmap` (elemIndex x cA)
eC x z = elemIndex x cA >>= index z
eC :: Char -> [Char] -> Maybe Char
eC x z = (z !!) `fmap` (elemIndex x cA)