Интересная идея.Интересно, что вы пытаетесь сделать, поскольку это довольно необычная проблема сопоставления с образцом.
Вы, безусловно, можете сделать это, если можете:
- перечислять конструкторы типа
- имеют равенство на элементах типа
Примерно так (я разрываю применение части f
, поскольку она ортогональна):
wasBuilt :: Eq t => (t -> Either t t) -- ^ the constructor
-> Either t t -- ^ a value
-> Maybe t -- ^ the transformed result
wasBuilt k v = case v of
Left x | v == k x -> Just x
Right x | v == k x -> Just x
_ -> Nothing
Но есть много шаблонного.Эта проблема кричит "дженерики" на меня.Попробуйте другой подход и отразите конструктор в данных, а затем, возможно, в целом сопоставьте эти данные.Это позволит вам рассматривать конструкторы как значения, а не функции.
Вот примерно то, о чем я думал, но обратите внимание, что это продвинутая техника.Явное сопоставление с образцом в обычном AST намного идиоматичнее:
import Generics.SYB
-- only works for unary constructors
sameConstructor :: (Data a, Data b) => (a -> b) -> b -> Bool
sameConstructor k v = toConstr v == toConstr (k undefined)
> sameConstructor (Left :: Char -> Either Char Char) (Right 'x')
False
> sameConstructor (Left :: Char -> Either Char Char) (Left 'x')
True
> sameConstructor (:[]) "haskell"
True