«Может быть,«-подобная функция для Bool и список?
-
27-09-2019 - |
Вопрос
Иногда я нахожусь прогмированием шаблона «Если Bool не является ложным» или «если список не пустое, используйте его, в противном случае используйте что-то еще».
Я ищу функции для Bool и список, которые находятся в том, что может быть функция «может быть». Есть ли?
Обновление: я хотел использовать Bool-Case в качестве обобщения списка. Например, при работе с data.text как t:
if T.null x then x else foo x
Я ищу, чтобы уменьшить такой код котельной пластины.
Решение
Я думаю, что ответ, вероятно, что нет такой общей функции. Как говорит DJV, вы можете построить данные. Молохи, чтобы написать один, что-то вроде:
maybe' :: (Eq a, Monoid a) => b -> (a -> b) -> a -> b
maybe' repl f x = if x == mempty then repl else f x
Но я не знаю о каких-либо функциях в стандартной библиотеке, как таковой (или любой, который может быть легко составлен вместе, чтобы сделать это).
Другие советы
Может быть, это катаморфизм, возможно, типа.
Foldr - это катаморфизм типа списка.
Если вы использовали, может быть, как: maybe x (const y)
Вы могли бы использовать: foldr (const (const y)) x
Для Bool я также пропускаю катаморфизм в стандартной библиотеке, но это было бы:
bool :: a -> a -> Bool -> a
bool t _ True = t
bool _ f False = f
Проверить Data.monoid, это типекласс, описывающий типы данных, которые имеют обозначенное пустое значение, и вы можете сформировать - сопоставить на нее, чтобы написать свою общую функцию. Есть случаи для Bool
с пустым значением False
и для List
с пустым значением []
.