🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.lang.funkcyjne
Article #358

[Haskell] Lista bez powtórzeń.

#358
From: Marcin Gajda
Date: Sun, 15 Jun 2003 20:09
45 lines
2399 bytes
Witam,

nie szukałem za bardzo w Prelude i modułach, ale potrzebuję funkcji
określającej, czy w liście nie ma powtórzeń. Do głowy przyszło mi takie
cudo poniżej, lecz na hugsie dla [1..10000] (specjalnie złośliwy
przypadek, aby wywalić naiwnego quicksorta) działa już trochę za długo:

{-
 - Daje medianę trzech elementów
 -}
mediana :: Ord a => a -> a -> a -> a
mediana a b c = if a <= b then
                    if b <= c then b
                    else if a <= c then c else a
                else
                    if a <= c then a
                    else if b <= c then c else b

{-
 - Sprawdza elementy.
 -}
rozna_lista :: Ord a => [ a ] -> Bool
rozna_lista []          = True
rozna_lista [ a ]       = True
rozna_lista [ a , b ]   = a /= b
rozna_lista l           = let m = mediana
					( head  l )
					( head ( drop ( ( length l ) `div` 2 ) l ) )
					( head ( reverse l ) ) in
                            length ( [ a | a <- l , a == m ] ) == 1 &&
                            rozna_lista [ a | a <- l , a < m ] &&
                            rozna_lista [ a | a <- l , a > m ]

Sorki za przekroczenie 72 znaków - tak jakoś mi się pisało ;)

Tak więc - macie może jakiś pomysł na coś szybszego? Mógłbym posortować w
O(nlogn) jakimś merdżsortem, ale nie jestem pewien, czy tędy droga...

Wszelkie uwagi (krytyczne!) na temat stylu i podejścia miło widziane - dopiero
się zapoznaję z tym Haskellem :P

Pozdrawiam,
-- 
Marcin Gajda ________________________
Dieu me pardonerra - c'est son metier
Technical Details
Message-ID: <bcijpt$1s1$1@kenny.mimuw.edu.pl>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!mimuw.edu.pl!news.mimuw.edu.pl!not-for-mail

Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!mimuw.edu.pl!news.mimuw.edu.pl!not-for-mail
From: Marcin Gajda <marcin.gajda@kicha.zagrycha.pl>
Newsgroups: pl.comp.lang.funkcyjne
Subject: [Haskell] Lista bez powtórzeń.
Date: Sun, 15 Jun 2003 20:09:33 +0000 (UTC)
Organization: MIMUW
Lines: 45
Sender: Marcin Gajda <mg174717@zodiac.mimuw.edu.pl>
Message-ID: <bcijpt$1s1$1@kenny.mimuw.edu.pl>
NNTP-Posting-Host: zodiac.mimuw.edu.pl
Mime-Version: 1.0
X-Trace: kenny.mimuw.edu.pl 1055707773 1921 10.1.1.1 (15 Jun 2003 20:09:33 GMT)
X-Complaints-To: abuse@news.mimuw.edu.pl
NNTP-Posting-Date: Sun, 15 Jun 2003 20:09:33 +0000 (UTC)
User-Agent: tin/1.5.10-20011117 ("Darkcell") (UNIX) (Linux/2.4.20 (i686))
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit