C'è un modo per scrivere questo fold neater in Haskell?

1

Ho la seguente piccola funzione che utilizza foldr per trovare il secondo più grande numero di una tupla da 2:

listMax :: [(Int,Int)] -> Int
listMax = snd . foldr (\(_,freq1) (_,freq2) -> (0,max freq1 freq2)) (0,0)

La mia domanda riguarda il corpo del lambda:

(0,max freq1 freq2)

Ho dovuto trasformarlo in una tupla con una testa fittizia in modo che corrisponda al proprio input per la piega. Per me, sembra brutto e rende più difficile leggere. È questo il modo standard di affrontare questa situazione, o c'è un modo idiomatico attorno a questo?

    
posta Carcigenicate 22.07.2014 - 04:19
fonte

2 risposte

4

Beh, probabilmente lo scriverò come

listMax :: [(Int,Int)] -> Int
listMax = foldr max 0 . map snd

La fusione degli elenchi dovrebbe in realtà far sì che questo compili alla fine alla fine:)

Vale la pena notare che ciò è tecnicamente errato in quanto si comporterebbe male con tutti i numeri negativi.

listMax = foldr max minBound . map snd
    
risposta data 22.07.2014 - 06:02
fonte
0

Come sottolineato da jozefg, la tua versione non è corretta per i numeri negativi, dato che dà 0.

Vorrei scrivere

listMax = foldr1 max . map snd

La differenza tra la mia soluzione e la loro è il comportamento per le liste vuote. Il mio dà un'eccezione, che ritengo sia appropriata, dal momento che una lista vuota non ha un minimo. Il loro ritorno minBound.

    
risposta data 05.01.2015 - 04:05
fonte

Leggi altre domande sui tag