我有一个任务,要求我们实现一些功能。
我们必须实现一个函数apply :: State -> [Rule] -> State
,其中State
是String,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
问题是它对rules
中的每一条规则都应用else [char]
。理想情况下,它应该只对rules
中的最后一条规则应用else [char]
。
该怎么办呢?
3条答案
按热度按时间7xllpg7q1#
我想出来了,这就是解决方案:
字符串
因此,如果
lookup
函数返回Nothing
,那么我们将[char]
连接起来,否则我们将返回对应于ruleTable
中某个c
的s
。iovurdzv2#
根据@DavidFletcher在其中一条评论中的建议,并假设只有第一条规则匹配重要:
字符串
ru9i0ody3#
我建议拆分出一个辅助函数,将所有规则应用于单个字符。
字符串