функция типа «возможно» для Bool и List? - PullRequest
5 голосов
/ 01 октября 2010

Иногда я обнаруживаю, что программирую шаблон «если Bool не ложный» или «если список не пустой, используйте его, в противном случае используйте что-то другое».

Я ищу функции для Bool и Listэто то, что функция «может быть» для «Может быть».Есть ли какие-нибудь?

Обновление: я намеревался использовать Bool-case как обобщение List-case.Например, при работе с Data.Text как T:

if T.null x then x else foo x

Я хочу уменьшить такой код котельной пластины.

Ответы [ 3 ]

6 голосов
/ 14 октября 2010

Возможно - это катаморфизм типа Возможно.

foldr - катаморфизм типа списка.

Если вы использовали, возможно, как: maybe x (const y)

Вы можете использовать: foldr (const (const y)) x

Для Bool мне также не хватает катаморфизма в стандартной библиотеке, но это будет:

bool :: a -> a -> Bool -> a
bool t _ True = t
bool _ f False = f
4 голосов
/ 01 октября 2010

Я думаю, что ответ, вероятно, заключается в том, что нет такой обобщенной функции. Как говорит djv, вы можете, возможно, использовать Data.Monoid, чтобы написать что-то вроде:

maybe' :: (Eq a, Monoid a) => b -> (a -> b) -> a -> b
maybe' repl f x = if x == mempty then repl else f x

Но я не знаю ни одной функции в стандартной библиотеке, подобной этой (или любой, которая могла бы быть легко скомбинирована для этого).

3 голосов
/ 01 октября 2010

Проверьте Data.Monoid , это класс типов, описывающий типы данных, которые имеют назначенное пустое значение, и вы можете сопоставить его с шаблоном, чтобы написать свою универсальную функцию.Существуют экземпляры для Bool с пустым значением False и для List с пустым значением [].

...