Можно ли создать общую функцию, которая в качестве аргумента принимала бы Foo или Bar и возвращала бы функцию, которая использует этот аргумент в его сопоставлении с образцом?
Например, если у меня есть
isFoo :: SomeData -> Bool
isFoo (Foo _) = True
isFoo _ = False
isBar :: SomeData -> Bool
isBar (Bar _) = True
isBar _ = False
Есть ли способ создать общую функцию, что-то вроде
checkType :: SomeClass -> SomeData -> Bool
checkType (SomeClass _) = True
checkType _ = False
Я понимаю, что ситуация выглядит немного странно, а фактический прецедент немного сложнее, но проблема идентична.
Фактический код, который я пытаюсь реорганизовать, следующий
isString :: [LispVal] -> ThrowsError LispVal
isString [(String _)] = return $ Bool True
isString ((String _):xs) = isString xs >>= unpackBool >>= return . Bool
isString _ = return $ Bool False
isSymbol :: [LispVal] -> ThrowsError LispVal
isSymbol [(Atom _)] = return $ Bool True
isSymbol ((Atom _):xs) = isSymbol xs >>= unpackBool >>= return . Bool
isSymbol _ = return $ Bool False
isNumber :: [LispVal] -> ThrowsError LispVal
isNumber [(Number _)] = return $ Bool True
isNumber ((Number _):xs) = isNumber xs >>= unpackBool >>= return . Bool
isNumber _ = return $ Bool False
Итак, я хотел бы как-то сделать это более сухим