Haskell Fold реализация `elemIndex` - PullRequest
0 голосов
/ 25 марта 2019

Я смотрю на функцию Haskell elemIndex:

elemIndex :: Eq a => a -> [a] -> Maybe Int

Что означает Maybe в этом определении?Иногда, когда я это называю, у выхода есть Just или Nothing Что это значит?Как я могу интерпретировать это, если бы я использовал складки?

Ответы [ 3 ]

1 голос
/ 25 марта 2019

Maybe - тип суммы.
Тип суммы - это любой тип, имеющий несколько возможных представлений.
Например:

data Bool = False | True

Bool может быть представлен как True или False. То же самое и с Возможно.

data Maybe a = Nothing | Just a

Тип Maybe инкапсулирует необязательное значение.
Значение типа Maybe a либо содержит значение типа a (представленное как Just a), либо оно пустое (представлено как Nothing)

elemIndex :: Eq a => a -> [a] -> Maybe Int

Функция elemIndex возвращает индекс первого элемента в данном списке, который равен (==) элементу запроса, или Nothing, если такого элемента нет.

Давайте сравним это с функцией indexOf
Каковы возможные значения этого метода?

  1. Индекс элемента в массиве в случае, если он был найден (скажем, 2).
  2. -1, если он не был найден.

Еще один способ представить это:

  1. Вернуть число, если оно было найдено - Just 2.
  2. Вместо того, чтобы возвращать магические числа, такие как -1, мы можем вернуть значение, которое представляет
    вариант отказа - Nothing.

Относительно "Как я могу интерпретировать это, если бы мне пришлось использовать складки", у меня недостаточно информации, чтобы понять вопрос.

1 голос
/ 30 марта 2019

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
1 голос
/ 25 марта 2019

Первый вопрос:

Что это значит?

Это означает, что возвращаемое значение является либо индексом (Int), либо Nothing.

из документов :

Функция elemIndex возвращает индекс первого элемента в данном списке, который равен (по ==)элемент запроса, или Ничего , если такого элемента нет.

Второй вопрос:

Как я могу интерпретировать это, если я буду использоватьFolds?

Я не уверен, что есть достаточно контекста для части «были использованы фолды».Но есть как минимум 2 способа использования этой функции:

  1. анализ случая, где вы указали, что возвращать в каждом случае:
case elemIndex xs of                                                                                           
  Just x -> f x        -- apply function f to x.
  Nothing -> undefined -- do something here, e.g. give a default value.
использовать функцию возможно :
maybe defaultValue f (elemIndex xs)
...