Maybe
является конструктором типа.
Int
является типом.Maybe Int
является типом.
String
является типом.Maybe String
- это тип.
Для любого типа a
, Maybe a
- это тип.Его значения бывают двух видов: Nothing
или Just x
, где x
- это значение типа a
(мы пишем: x :: a
):
x :: a
----------------- ------------------
Just x :: Maybe a Nothing :: Maybe a
В первом правилеa
как в типе значения x :: a
, так и в типе значения Just x :: Maybe a
одинаковы.Таким образом, если мы знаем тип x
, мы знаем тип Just x
;и наоборот.
Во втором правиле ничто в значении Nothing
само по себе не определяет a
в его типе.Определение будет сделано в соответствии с тем, как это значение используется , то есть из контекста его использования, с его сайта вызова.
Что касается реализации сгиба elemIndex
, она можетбыть например
elemIndex_asFold :: Eq a => a -> [a] -> Maybe Int
elemIndex_asFold x0 = foldr g Nothing
where
g x r | x == x0 = Just x
| else = r