Je commence juste avec Haskell et ai martelé cet algo récursif simple pour trouver le LCM pour chaque nombre dans une liste. Cela fonctionne, mais c'est en désordre et j'espérais un examen par les pairs sur la façon de le rendre plus élégant, lisible et Haskell-y.Existe-t-il un moyen plus propre et plus élégant pour écrire cette fonction LCM?
lcms list
| length list > 1 = lcms (lcm (head list) (head (tail list)):(tail (tail list)))
| otherwise = list
Alors qui prend une liste et fait LCM des deux premiers éléments, prepends ensuite à la liste moins ces deux éléments. Fondamentalement, le psudocode que je vais pour est comme ceci:
lcms [a,b,c] = lcm (a, (lcm (b, c))
Des suggestions, quelqu'un? Je suis impatient de m'améliorer chez Haskell et d'écrire des choses que les gens peuvent réellement lire. Les conseils d'efficacité sont les bienvenus aussi!
Merci à tous!
Oh cool, parfait, merci! Je dois étudier les plis et m'habituer à les utiliser davantage. En tant que question de suivi: y a-t-il une raison d'utiliser le pli paresseux du prélude sur le pli plus ardent de Data.List? Est-ce que c'est plus rapide? Je sais que le foldl paresseux peut créer des débordements de pile sur de grandes listes, mais ne sait pas quel avantage il offre ou de sa paresse est plus rapide pour les listes courtes. – clb
Vous pouvez également utiliser 'foldr', comme dans' lcms = foldr lcm 1' – amar47shah
@clball 'foldl' n'est presque jamais ce que vous voulez. –