Haskell: Bereken de verschillen van elk paar aangrenzende elementen in een lijst

Ik heb een functie (mergeall) die een floatlijst retourneert. Ik wil de verschillen berekenen van elk paar aangrenzende elementen in deze lijst. Bijvoorbeeld:

[1.1,2.2,3.3,4.4,5.5,6.6]
do 1.1-2.2, 2.2-3.3,3.3-4.4...
return list of all difference

Dit moet dus worden doorgegeven aan een lijst en een lijst retourneren. De problemen zijn:

  1. Hoe kan ik de lijst van "mergeall" gebruiken?
  2. Hoe kan ik het bovenstaande algoritme uitvoeren? Kan iemand me helpen? Bedankt!
2
Is dit huiswerk?
toegevoegd de auteur is7s, de bron

1 antwoord

differences fs = zipWith (-) fs (tail fs)
8
toegevoegd
Zou je niet . moeten gebruiken in plaats van ap omdat er geen sprake is van mondeing? Bovendien heeft . een lagere prioriteit dan de functietoepassing.
toegevoegd de auteur Jeff Burdges, de bron
Ahh, ap = liftM2 ($) heft hier de functie-applicatie op naar het tweede argument voor zijn eerste argument zipWith (-) maar knoeit niet met tail en de monade dicteert dat alle functies van toepassing zijn op dezelfde waarde. schattig. :)
toegevoegd de auteur Jeff Burdges, de bron
@ Kevin Ballard: daarom keert zipWith subtract = << tail terug naar de "originele" versie.
toegevoegd de auteur BMeph, de bron
@JeffBurdges Eigenlijk is er sprake van enige opheffing - met name in de (e ->) monade. Functiesamenstelling (.) snijdt het hier niet helemaal, omdat hetzelfde argument twee keer op verschillende plaatsen wordt weergegeven.
toegevoegd de auteur Daniel Wagner, de bron
Ik kan niet zeggen dat de puntvrije versie leesbaarder is.
toegevoegd de auteur augustss, de bron
Of de pointfree-versie: differences = ap (zipWith (-)) tail
toegevoegd de auteur Kevin Ballard, de bron
@augustss: Dat is waarom ik het als commentaar heb geleverd in plaats van als onderdeel van het juiste antwoord. Ik vind het interessant om de pointfree versies van verschillende functies te zien, maar ze zijn vaak meer stom.
toegevoegd de auteur Kevin Ballard, de bron
Overigens, als u het tegenovergestelde verschil wilt (bijvoorbeeld 2.2-1.1 ), zou de pointfree-versie er uitzien als zipWith (-) = << tail
toegevoegd de auteur Kevin Ballard, de bron
@JeffBurdges: Ja, het kostte me een tijdje om in te pakken hoe de (e ->) monade werkte. Ik vind het nog steeds sneller om het pointfree hulpprogramma te gebruiken om deze expressies voor mij te genereren, maar op zijn minst nu kan ik ze vrij gemakkelijk lezen.
toegevoegd de auteur Kevin Ballard, de bron