Как реализовать минимум с помощью 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' вызывается с пустым списком.