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)