2

我正在编写一个以 2 个替换作为参数的 Haskell 函数。我已经处理了如果任何一个参数是Nothing,那么函数将返回的情况Nothing。如果两者都不是Nothing,则应将它们组合成一个替换。我做了以下事情:

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

但是,我收到预期类型与实际类型不匹配的错误。我很困惑为什么。有任何想法吗?

4

2 回答 2

3

的类型++

(++) :: [a] -> [a] -> [a]

但是您试图将其应用于 type 的两个值Subst a

你可以写一个combineSubs这样的辅助函数:

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

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

于 2012-11-08T20:19:09.833 回答
2

只是对您的架构的评论:

没有替换(会在Nothing这里)和“空”替换之间真的有区别S []吗?如果没有,您可能应该将Maybe级别和代码缺失替换简单地删除为S []. 如果有差异,您可以考虑将这种情况添加到Subst,例如data Subst a = S [(String,a)] | None

于 2012-11-09T07:32:35.853 回答