Соответствие шаблону при привязке лямбда?

В Haskell я часто делаю что-то вроде этого:

f $ \x -> case x of
            A a1 a2 -> ...
            B b1 b2 -> ...
            C c1 c2 -> ...

Но я не хочу x, я просто хочу его деконструировать.

В стандартном ML я могу сделать что-то вроде этого:

f (fn A(a1,a2) => ...
    | B(b1,b2) => ...
    | C(c1,c2) => ...)

Есть ли способ сделать это в Haskell или с любыми расширениями GHC?

Ответ 1

Вы можете использовать расширение языка LambdaCase и выполнить

{-# LANGUAGE LambdaCase #-}
... 
f $ \case 
     A a1 a2 ->
...

в соответствии с вашим примером.

Подробнее об этом можно узнать в документации GHC