2010-10-01 2 views
5

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

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

Обновление: Я хотел использовать случай Bool как обобщение списка. Например, при работе с Data.Text as T:

if T.null x then x else foo x 

Я ищу, чтобы уменьшить такой код плиты котла.

+1

Просьба пример этой функции для Bool ... – kennytm

ответ

4

Я думаю, что ответ, вероятно, не существует такой общей функции. Как говорит 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

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

6

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

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

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

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

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

bool :: a -> a -> Bool -> a 
bool t _ True = t 
bool _ f False = f 
+2

Существует функция ['bool'] (http://hackage.haskell.org/package/base-4.8.0.0/docs/Data-Bool.html#v:bool) в последних пакетах пакета 'base'. –