我有一个作业要求我们实现一些功能。
我们必须实现一个功能
apply :: State -> [Rule] -> State
其中 State
是字符串,Rule
是 data Rule = Rule Char State deriving Show
这意味着我们应该能够调用函数 s.t.
apply "FXRYF" [Rule 'X' "XRYF", Rule 'Y' "FXLY"]
将产生 FXRYFRFXLYF"
。
我有一个(不足的)解决方案,缺少一些我不知道该怎么做的东西。
type State = String
data Rule = Rule Char State deriving Show
apply :: State -> [Rule] -> State
apply state rules = concat [if char == c then s else [char] | char <- state, Rule c s <- rules]
将产生
FFXRYFXRRYFXLYFF
问题在于它对
else [char]
中的每条规则都适用rules
。理想情况下,它应该只应用于 else [char]
中的最后一条规则 rules
。
该怎么办?
我想通了,这就是解决方案:
apply state rules =
let ruleTable = [(c, s) | Rule c s <- rules]
in concat [maybe [char] id (lookup char ruleTable) | char <- state]
因此,如果
lookup
函数返回 Nothing
,则我们连接 [char]
,否则我们返回与 s
中的某些 c
对应的 ruleTable
。