我有以下功能
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
我真的不明白这意味着什么......有人可以帮忙吗?
答案 0 :(得分:1)
这意味着elemIndex
会返回Maybe Int
,但您无法使用Maybe Int
作为!!
中的索引。
我相信这可以更简单地解决。我建议您查看zip
和find
。
编辑:oooh,zip
和lookup
在这种情况下更为直接。
答案 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)