Sigma-teken in haskell

Hoe kan ik dat realiseren? zoals het sigmateken in haskell?

Wat ik wil berekenen is dit:

http://img6.imagebanana.com/img/dulfkvz8/form.png

EDIT: Ik wil het Griekse karakter niet vertegenwoordigen. Ik wil de som berekenen.

bij voorbaat dank

1
Ik raad je aan het woord 'teken' niet in je titel te gebruiken, als datgene waarnaar je op zoek bent niet het daadwerkelijke sigma-teken is.
toegevoegd de auteur MatrixFrog, de bron
Ik weet niet zeker of de link correct is; bedoel je (x {sub i}, x {sub i + 1)) ?
toegevoegd de auteur John L, de bron
Wil je gebruik maken van de Griekse letter in de broncode van je programma, of wil je iets opsommen?
toegevoegd de auteur delnan, de bron
niet de Griekse letter, ik wil het opsommen.
toegevoegd de auteur user28061, de bron
Ja. Sry ik bedoelde dat ....
toegevoegd de auteur user28061, de bron

2 antwoord

Ervan uitgaande dat u de x waarden in een (niet-emtpy) lijst xs = [x1, x2, ... xn] heeft, kunt u deze als volgt schrijven:

sum $ zipWith fn xs (tail xs)
10
toegevoegd
Het is waarschijnlijk minder geavanceerd dan je denkt. De functie zipWith neemt 3 argumenten: het eerste argument is een functie ( fn ) en de tweede en derde argumenten zijn lijsten. Als u de online documentatie controleert, ziet u dat zipWith het functieargument gebruikt om de elementen in de twee lijsten paarsgewijs te combineren en de resultaten als een lijst retourneert (waarvan de lengte even lang is als de kortere invoer) lijst).
toegevoegd de auteur comingstorm, de bron
Je realiseert je wel dat het een x subscript is, geen i subscript op het tweede argument naar fn . Dit betekent dus niet wat de vergelijkingen aangeven. (Tenzij het natuurlijk een typfout is in de vergelijking.)
toegevoegd de auteur Thomas Eding, de bron
Voor dit specifieke probleem is dit waarschijnlijk de manier om te gaan.
toegevoegd de auteur user824425, de bron
En wanneer u zipWith gebruikt in combinatie met tail , zoals hier, moet u uw functie fn toepassen op elk 'aangrenzend' paar in de lijst .
toegevoegd de auteur user824425, de bron
Goede observatie, trinithis: DI, denk echter dat het veilig is om aan te nemen dat het een typfout is, omdat de x in de subset hier een niet-gedefinieerde vrije variabele is (ik heb voorbeelden gezien met dezelfde naam < code> x werd gebruikt, maar x -dat-altijd-heeft-een-subscript anders was dan x -altijd-zonder-subscript) of gewoon onzinnig .
toegevoegd de auteur user824425, de bron
Voor mij ziet dit er erg geavanceerd uit. misschien is er een meer eenvoudige manier om dit te implementeren?
toegevoegd de auteur user28061, de bron
Vanwege de hoge score heb ik dit antwoord als de oplossing gemarkeerd, hoewel ik uiteindelijk een recursie heb gebruikt.
toegevoegd de auteur user28061, de bron

Waarom geen eenvoudige recursieve functie?

sigma 0 fn = fn 
sigma i fn = fn + (sigma (i-1) fn)
3
toegevoegd
Merk op dat deze benadering (naïeve recursie) nogal afschuwelijk gedrag heeft voor langere sequenties. Deze specifieke implementatie is ook gewoon fn * (i + 1) voor n> = 0 en een oneindige lus voor i <0 ( je zou fn een functie van i moeten maken en het eigenlijk bij elke stap noemen).
toegevoegd de auteur delnan, de bron
Als het huiswerk is, kan naïeve recursie de manier zijn om te gaan.
toegevoegd de auteur nponeccop, de bron