Возможно ли создать универсальную функцию, которая будет принимать Foo или Bar в качестве аргумента и вернет функцию, которая использует этот аргумент в своем сопоставлении с образцом?Использовать параметр в качестве шаблона в Haskell
Например, если у меня есть
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
Так что я хотел бы какой-нибудь способ, чтобы сделать это более сухой
Может быть, если бы вы рассказать нам немного о том, что вы на самом деле пытаетесь сделать, могло быть лучше. См. [Проблема xy] (http://meta.stackexchange.com/q/66377/169090). Примечание: я новичок в Haskell, поэтому не знаю. – Shahbaz
В Haskell есть много общих библиотек программирования, которые могут позволить такие вещи. –
Я думаю, что вы делаете это с помощью шаблона Hsskell. –