0

我想多次使用 Eq,以便第一个连音的第二个元素来自其他类型而不是其他类型

错了,但是,这是我想要的想法

例如。[(a, a)] -> [(a, a)] -> Bool ----> [(a, b)] -> [(a, a)] -> Bool

编码

canColor ::  Eq a => [(a, a)] -> [(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, a)] -> a -> Maybe a
findNeighbour [] _ = Nothing
findNeighbour ((x,y):rest) z =
    if x == z
    then Just y
    else findNeighbour rest z

输入数据和期望值

Main> canColor [('a',"purple"),('b',"green"),('c',"blue")] [('a','b'),('b','c'),('c','a')]
True

Main> canColor [('a',"purple"),('b',"green"),('c',"purple")] [('a','b'),('b','c'),('c','a')]
False

Main> canColor [('1',"purple"),('2',"green"),('3',"blue")] [('1','2'),('2','3'),('3','1')]
True

**Main> canColor [('a', 4),('b',5),('c', 6 )] [('a','b'),('b','c'),('c','a')]
True

Main> colors [('a', 4),('b', 4 ),('c', 5 )] [('a','b'),('b','c'),('c','a')]
False**
4

1 回答 1

9

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

canColor :: (Eq a, Eq b) => [(a, b)] -> [(a, a)] -> Bool
canColor _ [] = 真
canColor xs ((x,y):rest) =
    如果 findNeighbour xs x == findNeighbour xs y
    然后是假的
    else canColor xs 休息

findNeighbour :: Eq a => [(a, b)] -> a -> Maybe b
findNeighbour [] _ = 没有
findNeighbour ((x,y):rest) z =
    如果 x == z
    那么就你
    else findNeighbour rest z

或者这个更简洁和惯用的代码:

canColor :: (Eq a, Eq b) => [(a, b)] -> [(a, a)] -> Bool
canColor xs = all (\(x,y) -> 查找 x xs /= 查找 y xs)
于 2012-11-23T11:49:38.767 回答