«Может быть,«-подобная функция для Bool и список?

StackOverflow https://stackoverflow.com/questions/3837696

  •  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 с пустым значением [].

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top