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結局、要素がリストにない可能性があります。この失敗モードは、最終的なタイプにする必要があります (何らかの方法で処理しない限り)。

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 に答える
1

これは が をelemIndex返すことを意味しますが、 のインデックスとしてMaybe Int使用することはできません。Maybe Int!!

これはもっと簡単に解決できると確信しています。と を調べることをお勧めしzipますfind

編集:うーん、zipこのlookup場合はさらに簡単です。

于 2013-10-08T22:51:00.077 に答える