String 作为参数的两个替换

String 作为参数的两个替换,string,haskell,substitution,String,Haskell,Substitution,我正在写一个Haskell函数,它接受2个替换作为参数。我已经处理过这样的情况,如果其中一个参数是Nothing,那么函数将返回Nothing。如果两者都不是Nothing,则应将它们合并为一个替换。我已经做了以下工作: args :: Maybe (Subst a) -> Maybe (Subst a) -> Maybe (Subst a) args (Just v) (Just v') = Just (v ++ v') args _ _ = Noth

我正在写一个Haskell函数,它接受2个替换作为参数。我已经处理过这样的情况,如果其中一个参数是
Nothing
,那么函数将返回
Nothing
。如果两者都不是
Nothing
,则应将它们合并为一个替换。我已经做了以下工作:

args :: Maybe (Subst a) -> Maybe (Subst a) -> Maybe (Subst a)
args (Just v) (Just v') = Just (v ++ v')
args _        _         = Nothing

但是,我收到了预期类型与实际类型不匹配的错误。我不明白为什么。有什么想法吗?

类型为
++

(++) :: [a] -> [a] -> [a]
但您试图将其应用于两个类型为
Subst a
的值

您可以像这样编写一个helper函数
combineSubs

combineSubs :: Subst a -> Subst a -> Subst a
combineSubs (S xs) (S ys) = S (xs ++ ys)

您还可以在函数的参数中对
S
进行模式匹配


无取代(此处为
Nothing
)和“空”取代基
S[]
之间真的有区别吗?如果没有,您可能应该删除
Maybe
级别,只需将缺少替换的代码替换为
S[]
。如果存在差异,您可以考虑将此情况添加到<代码>子ST> <代码>中,例如<代码>数据子A2= S [(字符串,a)]| None

您建议我如何使用模式匹配来进行此操作这里的基本思想是,函数
args
中的参数
v
v'
Subst a
类型的值。因此,您可以通过将变量替换为相应的模式来对这些值进行模式匹配。在
combineSubs
的定义中,您可以看到如何在
Subst a
@jancristiansen类型的值上进行模式匹配,因此基于您的示例,我尝试了类似的方法(请参见上面的编辑)。但是现在我得到了一个模式重叠错误我相信你当前的错误与你的行有关,它说,
args\uu=Nothing
重叠模式意味着有一个规则永远不匹配,因为其他模式匹配所有情况。因此,您的实现不应该导致重叠模式警告,奇怪的是,ghc-7.4.1没有报告警告。