0

Eq を複数回使用したいので、最初の連符の 2 番目の要素が残りの要素とは別の型になります。

間違っていますが、それは私が欲しいアイデアです

例えば。[(a, a)] -> [(a, a)] -> ブール ----> [(a, b)] -> [(a, a)] -> ブール

コード

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)]->ブール
canColor _ [] = True
canColor xs((x、y):rest)=
    findNeighbour xs x == findNeighbourxsyの場合
    次にFalse
    それ以外の場合はcanColorxsrest

findNeighbour :: Eq a => [(a、b)]->a->たぶんb
findNeighbour []_=何もありません
findNeighbour((x、y):rest)z =
    x==zの場合
    その後、ちょうどy
    それ以外の場合はfindNeighbourrestz

または、このより簡潔で慣用的なコード:

canColor ::(Eq a、Eq b)=> [(a、b)]-> [(a、a)]->ブール
canColor xs = all(\(x、y)-> lookup x xs / = lookup y xs)
于 2012-11-23T11:49:38.767 に答える