首页 > 解决方案 > 元组列表上的Haskell函数如何将所有组件与以下每个组件进行比较

问题描述

我正在尝试创建一个函数,它将元组列表中的元素与其他所有列表进行比较以获取特殊数据类型:

data Term = Var VarName | Comb CombName [Term]
  deriving (Eq, Show)
data Subst = Subst [(VarName, Term)]
  deriving Show

所以我正在尝试执行以下操作:

[(VarName "Y",Comb "2" []),(VarName "Y",Var (VarName "X"))]   -> Subst [(VarName "Y",Comb "2" [])]

如果我们有一个元组 (a,b),那么我们想检查 [(VarName,Term)] 中的每个元组是否有任何元组 (c,d) 其中 a=b 如果是,那么我们想检查 b 是否具有类型 Comb x [] 或 d 的类型为 Comb x []。在检查我们想要删除元组之后,第二个组件的类型不是 Comb x []。(不可能有将 Comb x [] 作为类型作为第二个组件的元组)

我的尝试:

test :: [(VarName,Term)] -> [(VarName,Term)]
test []         = []
test ((x,y):[]) = ((x,y):[]) 
test ((x,y):xs) = map (check (x,y) xs)

check (VarName,Term) -> [(VarName,Term)] -> (VarName,Term)
check (x,y) [] = [(x,y)]
check (x,y) ((a,b):xs) = if x==a && y = CombName i [] then (x,y) else ((a,b))

有人可以帮帮我吗,我是Haskell的新手。谢谢 :)

标签: listhaskelldata-structurestuples

解决方案


我想你正在寻找nubBy :: (a -> a -> Bool) -> [a] -> [a]. 试试nubBy (on (==) fst)


推荐阅读