Haskell,如何使用多个等式(等式a、等式b)=>

Haskell,如何使用多个等式(等式a、等式b)=>,haskell,Haskell,我想使用多次Eq, 因此,第一个元组的第二个元素来自其他类型 错了,但这正是我想要的 例如[a,a]->[a,a]->Bool-->[a,b]->[a,a]-> 布尔 代码 输入数据和期望值 只需给它们不同类型的变量,并要求两者都使用Eq。我认为您正在寻找以下代码: canColor :: (Eq a, Eq b) => [(a, b)] -> [(a, a)] -> Bool canColor _ [] = True canColor xs ((x,y):rest) = if fin

我想使用多次Eq, 因此,第一个元组的第二个元素来自其他类型

错了,但这正是我想要的

例如[a,a]->[a,a]->Bool-->[a,b]->[a,a]-> 布尔

代码

输入数据和期望值


只需给它们不同类型的变量,并要求两者都使用Eq。我认为您正在寻找以下代码:

canColor :: (Eq a, Eq b) => [(a, b)] -> [(a, a)] -> Bool canColor _ [] = True canColor xs ((x,y):rest) = if findNeighbour xs x == findNeighbour xs y then False else canColor xs rest findNeighbour :: Eq a => [(a, b)] -> a -> Maybe b findNeighbour [] _ = Nothing findNeighbour ((x,y):rest) z = if x == z then Just y else findNeighbour rest z 或者这段更简洁、更惯用的代码:

canColor :: (Eq a, Eq b) => [(a, b)] -> [(a, a)] -> Bool canColor xs = all (\(x,y) -> lookup x xs /= lookup y xs)
findNeighbour似乎正在进行参数交换的查找。请注意,查找允许a,b而不是a,a。这有帮助吗?Haskell的类型推断意味着许多问题都可以通过删除类型签名并在GHCi中使用:t检查函数来回答。即,如果没有显式类型签名,GHC将推断canColor::Eq a,Eq b=>[a,b]->[a,a]->Bool。 canColor :: (Eq a, Eq b) => [(a, b)] -> [(a, a)] -> Bool canColor _ [] = True canColor xs ((x,y):rest) = if findNeighbour xs x == findNeighbour xs y then False else canColor xs rest findNeighbour :: Eq a => [(a, b)] -> a -> Maybe b findNeighbour [] _ = Nothing findNeighbour ((x,y):rest) z = if x == z then Just y else findNeighbour rest z canColor :: (Eq a, Eq b) => [(a, b)] -> [(a, a)] -> Bool canColor xs = all (\(x,y) -> lookup x xs /= lookup y xs)