インデックス演算子のように機能する次の関数があります。
let {
index :: [a]->Int->Maybe a
index [] i = error "Empty list"
index l i = if i <= ((length l) - 1) && i >= 0 then
Just(l !! i)
else
error "Index out of bounds"
}
さて、最初はこれを使用せずに書きましたJust
(そして、グーグルの後でもそれが何であるかはまだわかりません):
let {
index :: [a]->Int->Maybe a
index [] i = error "Empty list"
index l i = if i <= ((length l) - 1) && i >= 0 then
(l !! i)
else
error "Index out of bounds"
}
私にとって、上記の機能は完全に理にかなっています。ここには、「ジェネリック型」のリストを受け入れる関数とa
、Int
インデックスでありMaybe
、型の値を返すa
か、ランタイム例外をスローする関数があるためです。ただし、GHCiがこれを教えてくれるところが少しわかりません:
<interactive>:1:120:
Couldn't match type `a' with `Maybe a'
`a' is a rigid type variable bound by
the type signature for index :: [a] -> Int -> Maybe a
at <interactive>:1:34
Expected type: [Maybe a]
Actual type: [a]
In the first argument of `(!!)', namely `l'
In the expression: (l !! i)
では、なぜ GHCi は の型と混同され、型のl
リストを期待しているのMaybe a
でしょうか? 最後に、どのようJust
に問題を解決しますか?