Haskell: Почему сопоставление с образцом работает для типов, не являясь экземплярами равенства?

Мне интересно, как работает сопоставление с образцом в Haskell. Я знаю эту тему, но не совсем понял ответы в ней.

  • В ответах указано, что типы сопоставляются логическими выражениями, но как это возможно?
  • Еще я обнаружил, что сопоставление с образцом является более общим, чем (==)и Уравнение реализовано с использованием сопоставления с образцом.

Можете ли вы сказать мне, почему matchи match3работают, даже если я опускаю вывод (Eq)в следующем фрагменте кода (понятно, почему match2не работает)?

data MyType = TypeA | TypeB
            deriving (Eq)

match :: MyType -> String
match TypeA = "this is type A"
match TypeB = "this is type B"

match2 :: MyType -> String
match2 a | a == TypeA = "this is type A matched by equality"
         | a == TypeB = "this is type B matched by equality"
         | otherwise = "this is neither type A nor type B"

match3 :: MyType -> String
match3 a = case a of TypeA -> "this is type A matched by case expression"
                     TypeB -> "this is type B matched by case expression"

main :: IO ()
main = do
    (print . match) TypeA
    (print . match) TypeB
    (print . match2) TypeA
    (print . match2) TypeB
    (print . match3) TypeA
    (print . match3) TypeB

7
задан Matthias Braun 15 July 2019 в 08:24
поделиться