Хорошо, это немного смущает, но я обнаружил, что просто делать это работает:
{-# LANGUAGE PatternSynonyms #-}
pattern P :: Int -> [Int]
pattern P a <- a:_
f :: [Int] -> Int
f (P b) = b
main = print $ f [42]
Ключевым моментом здесь является то, что параметр шаблона становится явным, но затем он также передается как b
шаблон 1 , который будет соответствовать.Мне не хватало этой части головоломки.
Недостатком является то, что, очевидно, вам необходимо перечислить все части шаблона, который вы хотите использовать.
1 Конечно, это все еще можно назвать a
, я просто назвал его по-другому для иллюстрации.