2010-01-20 2 views
12

Скажет, у меня естьразворачивание типов данных в Haskell без постороннего кода

x = Just 2 

Есть ли способ (предпочтительн является встроенным механизмом/функция), чтобы использовать й в одном операторе, что если это просто, то 2 автоматически распаковывается и используется, а если это ничего, возникает исключение?

То есть,

(f x) + 2 == 4 если x == Just 2 и вызывает исключение, если x == Nothing.

ответ

22

Data.Maybe.fromJust было упомянуто другими ответами уже:

fromJust :: Maybe a -> a 
fromJust Nothing = error "Maybe.fromJust: Nothing" 
fromJust (Just x) = x 

Там также maybe (найденный в обоих Prelude и Data.Maybe):

maybe :: b -> (a -> b) -> Maybe a -> b 
maybe n _ Nothing = n 
maybe _ f (Just x) = f x 

fromJust можно записать с помощью maybe:

fromJust = maybe (error "Maybe.fromJust: Nothing") id 

Как вы можете видеть, maybe позволяет вам гибкость при работе обоих случаях, не требуя соответствия шаблону:

\x -> maybe 0 (+ 2) x -- Nothing -> 0, Just 2 -> 4 

Аналогично, Prelude и Data.Either имеют either :: (a -> c) -> (b -> c) -> Either a b -> c:

\x -> either (subtract 1) (* 2) x -- Left 5 -> 4, Right 3 -> 6 

Если определить данные тип

data MyDataType 
    = TypeA { foo :: Int, bar :: String } 
    | TypeB { foo :: Int,    baz ::() } 
    | TypeC {    bar :: String, baz ::() } 

вот так вы получите частичные функции для аксессуаров.

foo :: MyDataType -> Int 
bar :: MyDataType -> String 
baz :: MyDataType ->() 

Их называют частичными функциями, в отличие от полных функций, поскольку они возвращают результаты только для подмножества их входов.

foo (TypeA { foo = 15, bar = "hello!" }) -- 15 
bar (TypeB { foo = 12345679, baz =() }) -- error 
9

Для данного конкретного случая, fromJust. В общем

let Just k = x in f k + 2 == 4 

Этот трюк работает с любым типом данных конструктора и очень часто используется с (:) для непустых списков.

Смежные вопросы