Развертывание типов данных в Haskell без постороннего кода - PullRequest
12 голосов
/ 20 января 2010

Скажите, у меня есть

x = Just 2

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

То есть

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

Ответы [ 3 ]

22 голосов
/ 20 января 2010

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 голосов
/ 20 января 2010

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

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

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

8 голосов
/ 20 января 2010

fromJust должен делать то, что вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...