优化Haskell函数以正确应用规则并避免重复字符

问题描述 投票:0回答:1

我有一个作业要求我们实现一些功能。

我们必须实现一个功能

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

该怎么办?

haskell functional-programming list-comprehension
1个回答
0
投票

我想通了,这就是解决方案:

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

© www.soinside.com 2019 - 2024. All rights reserved.