4

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関数は、多くの共通の構造を持っています。この共通構造を因数分解するにはどうすればよいですか?

4

1 に答える 1

6

パターンマッチ自体をパラメーター化することはできませんが、小さなヘルパー関数を自分で作成できるため、少なくともすべての関数に対してリスト処理を繰り返す必要はありません。

isString (String _) = True
isString _ = False

isNumber (Number _) = True
isNumber _ = False

all1 _ [] = False
all1 f xs = all f xs

isListOfStrings = Bool . all1 isString
isListOfNumbers = Bool . all1 isNumber

私の意見では、空のリストの特殊なケースの処理はここでは一貫していません。代わりに使用することを検討する必要がありallます(Haskellのリストの動作と同様に、空のリストを任意の種類のリストにすることができます)。

于 2012-04-15T21:05:23.580 に答える