2016-11-26 4 views
3

Ich möchte eine Funktion wie schreiben:Wie überprüfe ich, ob eine Liste von Bool-Werten den gleichen Wert enthält?

sameBool :: [Bool] -> Bool 

zum Beispiel:

[True, False, True] => False 
[True, True] => True 

Hier ist meine Lösung:

sameBool :: [Bool] -> Bool 
sameBool xs = if head xs == True 
        then length (filter (== False) xs) == 0 
        else length (filter (== True) xs) == 0 

Mit Wirkung aber nicht elegant. Ich suche eine elegantere Lösung.

Antwort

7

Mit all:

sameBool :: [Bool] -> Bool 
sameBool xs = all (== head xs) xs 

Mit nub von Data.List:

import Data.List 

sameBool :: [Bool] -> Bool 
sameBool = (== 1) . length . nub 

Eigentlich arbeitet sie für jede Instanz von Eq:

sameBool :: Eq a => [a] -> Bool 
sameBool xs = all (== head xs) xs 
-- Note: return True for [] 

sameBool :: Eq a => [a] -> Bool 
sameBool = (== 1) . length . nub 
-- Note: return False for [] 

prüfen nubBy für Typen, die ‚aren t Instanzen von Eq.

+3

Statt '(== 1). Länge "würde ich' null verwenden. drop 1', weil es fauler ist. Das heißt, es muss nicht die ganze Liste durchlaufen, wenn es bereits ein "Wahr" und ein "Falsch" gefunden hat. Beachten Sie, dass diese Änderung auch "True" für "[]" anstelle von "False" zurückgibt, was möglicherweise erwünscht ist oder nicht. – jpath

+3

Wow. Einer der wenigen Fälle, in denen 'head xs' auf der leeren Liste nicht fehlschlägt. Es dauerte ein paar Sekunden, bis ich merkte, dass es wirklich sicher war :-) – chi

+0

@jpath Sein eigener Code triggert Ausnahme auf einer leeren Liste – Wentao

Verwandte Themen