Определение типа алгебраической структуры данных - PullRequest
0 голосов
/ 20 октября 2018

Предположим, data MyAlgebraicType :: Foo Int | Bar Int.Если у меня есть переменная типа MyAlgebraicType, как мне определить, является ли она Foo Int или Bar Int?

Ответы [ 2 ]

0 голосов
/ 20 октября 2018

Сопоставление с образцом обычно лучше, но в некоторых случаях код легче читать с помощью таких функций:

isFoo :: MyAlgebraicType -> Bool
isFoo (Foo _) = True
isFoo _       = False

isBar :: MyAlgebraicType -> Bool
isBar (Bar _) = True
isBar _       = False
0 голосов
/ 20 октября 2018

Использование case:

let var = Bar 42 in
case var of
    Foo _ -> putStrLn "It's a Foo!"
    Bar _ -> putStrLn "It's a Bar!"

Эти _ можно заменить на имя переменной, чтобы связать содержащийся Int.

Вы также можете использовать шаблонопределение соответствия (которое встречается чаще, чем case):

tellMeIt :: MyAlgebraicType -> IO ()
tellMeIt (Foo _) = putStrLn "It's a Foo!"
tellMeIt (Bar _) = putStrLn "It's a Bar!"
...