2015-06-09 8 views
6

Sto provando a scrivere una funzione che restituisce il più lungo di due stringhe. Finora questo è quello che ho:Un modo elegante per restituire il più lungo di due stringhe

maxString :: String -> String -> String 
maxString a b 
    | (length a) > (length b) = a 
    | otherwise = b 

questo funziona, ma mi chiedo se c'è un modo più elegante di scrivere questo. Nota: i due argomenti non possono essere in una lista. Devono essere argomenti separati per consentire il currying.

Pensieri?

+1

attenti alle liste infinite! – karakfa

risposta

6

Questo è praticamente il modo più conciso per scriverlo. Tuttavia, la versione seguente terminerà anche quando una lista è infinita (O (min (a, b)) invece di O (a + b)).

Inoltre, non c'è alcuna vera ragione per limitare la funzione di solo corde quando non avrebbe molto senso per gli elenchi arbitrari.

8

È possibile utilizzare strutture Haskell esistente nella Data.Ord e Data.Function e ottenere un one-liner come segue:

maxString' x y = maximumBy (compare `on` length) [x, y] 

Codice:

import Data.Ord 
import Data.Function 
import Data.List 

maxString' x y = maximumBy (compare `on` length) [x, y] 

*Main> maxString' "ab" "c" 
"ab" 

- EDIT -

Come @ DavidYoung ha sottolineato,

compare `on` length 

sopra può anche essere scritta in una forma più breve: comparing length

+2

Puoi anche scrivere '' confronta 'on' length'' come' comparing length'. –

+0

@DavidYoung Grazie. Giusto. – tinlyx

9

Finora tutte le risposte eccetto Tejing Traverse completamente entrambi gli argomenti. Questo attraversa solo fino alla fine del più breve.

longest a b = l' a b where 
    l' _ [] = a 
    l' [] _ = b 
    l' (_:ar) (_:br) = l' ar br 
+0

Questo è interessante. gloria – dopatraman

8

Giocato un po 'con questo. Volevo che fosse un one-liner oltre ad avere la complessità O(min(n,m)). (cioè lavorando anche con liste infinite)

maxList :: [a] -> [a] -> [a] 
maxList s s' = if s == zipWith const s s' then s' else s 
Problemi correlati