Как реализовать минимум с помощью Foldr (или FoldMap)?

Я хочу реализовать минимум с Foldr или FoldMap. Согласно упражнению, оно должно иметь следующее определение:

mini :: (Foldable t, Ord a) => t a -> Maybe a -- named "mini" to avoid name clash

Это звучало довольно просто, но я не знаю, что я могу заменить на X ниже, чтобы заставить его работать. Помогите, пожалуйста?

mini xs = Just (foldr min X xs)

И вы получаете бонусные баллы за то, что показали мне, как это сделать с помощью foldMap, но это кажется сложнее.

2 ответа

Решение

Вы могли бы сделать:

mini :: (Foldable f, Ord a) => f a -> Maybe a
mini = foldr maybeMin Nothing
  where
    maybeMin x Nothing = Just x
    maybeMin x (Just y) = Just (min x y) 

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

Другие вопросы по тегам