0

我有以下功能

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

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

4

3 回答 3

1

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

我相信这可以更简单地解决。我建议调查zipand find

编辑:哦,ziplookup这种情况下更简单。

于 2013-10-08T22:51:00.077 回答
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实例更简单地做到这一点Maybe

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

甚至

eC x z = elemIndex x cA >>= index z
于 2013-10-09T00:34:33.623 回答
0

你也可以只使用Functor

eC :: Char -> [Char] -> Maybe Char
eC x z = (z !!) `fmap` (elemIndex x cA)
于 2013-10-09T08:16:09.497 回答