关于elemIndex的Haskell MaybeInt查询

时间:2013-10-08 22:45:06

标签: 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

我真的不明白这意味着什么......有人可以帮忙吗?

3 个答案:

答案 0 :(得分:1)

这意味着elemIndex会返回Maybe Int,但您无法使用Maybe Int作为!!中的索引。

我相信这可以更简单地解决。我建议您查看zipfind

编辑:oooh,ziplookup在这种情况下更为直接。

答案 1 :(得分:1)

毕竟,

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

eC :: Char -> [Char] -> Maybe Char

然后你可以传播失败

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

您可以使用Monad的{​​{1}}实例更简单地执行此操作。

Maybe

甚至

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

答案 2 :(得分:0)

您也可以只使用Functor

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