Разворачивание типов данных в Haskell без постороннего кода

Скажите, что я имею

x = Just 2

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

Таким образом,

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

12
задан Don Stewart 18 April 2011 в 22:05
поделиться

3 ответа

Data.Maybe.fromJust уже упоминалось в других ответах:

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

There's также maybe (found in both Prelude and Data. Возможно):

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

изJust можно записать, используя возможно:

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

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

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

Аналогично, Прелюдия и Данные.либо имеют либо :: (a -> c) -> (b -> c) -> либо 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
22
ответ дан 2 December 2019 в 03:48
поделиться

Для этого конкретного случая из проместителя . В целом

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

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

9
ответ дан 2 December 2019 в 03:48
поделиться

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

8
ответ дан 2 December 2019 в 03:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: