Write Yourself a Scheme in 48 Hoursの演習に取り組もうとしています。いくつかの機能を単純化するのに助けが必要です。
data LispVal = Number Integer
| String String
| Bool Bool
isNumber :: [LispVal] -> LispVal
isNumber [] = Bool False
isNumber [(Number _)] = Bool True
isNumber ((Number _):xs) = isNumber xs
isNumber _ = Bool False
isString :: [LispVal] -> LispVal
isString [] = Bool False
isString [(String _)] = Bool True
isString ((String _):xs) = isString xs
isString _ = Bool False
isNumber
およびisString
関数は、多くの共通の構造を持っています。この共通構造を因数分解するにはどうすればよいですか?