我正在编写一个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
但是,我收到了预期类型与实际类型不匹配的错误。我很困惑为什么。有什么想法吗?
答案 0 :(得分:3)
++
的类型是
(++) :: [a] -> [a] -> [a]
但您尝试将其应用于Subst a
类型的两个值。
您可以像这样写一个帮助函数combineSubs
:
combineSubs :: Subst a -> Subst a -> Subst a
combineSubs (S xs) (S ys) = S (xs ++ ys)
您还可以在函数S
的参数中对args
进行模式匹配。
答案 1 :(得分:2)
只是对您的架构发表评论:
没有替换(这里是Nothing
)和“空”替代S []
之间真的有区别吗?如果没有,您可能应该将Maybe
级别和代码丢失替换为S []
。如果 存在差异,您可以考虑将此案例添加到Subst
,例如data Subst a = S [(String,a)] | None
。