תכנות פונקציונלי – הבדלי גרסאות

תוכן שנמחק תוכן שנוסף
ביטול גרסה 14415792 של Elaz85 (שיחה) - לאחר שלא הייתה תגובה בדף השיחה במשך חודשיים
ביטול גרסה 14681987 של Effib (שיחה) נוספה תגובה
שורה 43:
המימוש הזה תואם ישירות את ההגדרה המתמטית הרקורסיבית של פעולת העצרת: <math>\ n! = n \cdot (n-1)!</math> ותנאי ההתחלה <math>\ 0!=1</math>. במימוש זה, אין כל שינוי בערכי המשתנים! למעשה, המשתנים בשפות פונקציונליות אינם ברי שינוי: בכל קריאה לפונקציה נוצרים משתנים חדשים, המקבלים ערכים חדשים, וכן הלאה.
 
=== הסרת ערכים כפולים ומיון ברשימה ===
 
בדוגמה הבאה בשפת [[C#|#C]] מתבצעת פעולה של הסרת ערכים כפולים (Distinct) מתוך משתנה רשימה המכיל מחרוזות ומיונם (OrderBy) לאחר הסרת תווי רווח מקדימים (TrimStart), והעברתם למשתנה (ToList). השיטה Distinct הקיימת באובייקט list1 מסירה את הערכים הכפולים, התוצאה מועברת לשיטה OrderBy הממיינת את הערכים, לאחר הסרת רווחים מקדימים, והתוצאה לבסוף מועברת לייצוג בצורת רשימה באמצעות השיטה ToList. ניתן לראות שבשורה אחת התבצעו מספר פקודות. בפונקציית OrderBy ניתן לראות שפונקציה מקבלת כפרמטר פונקציה אחרת. ה-X בפונקציה OrderBy חלק מתחשיב למדא מייצג פונקציה אנונימית, שמחזירה את האיברים שב-list. מכיוון שבדוגמה ה-list מכיל רשימת מחרוזות, כל x מייצג מחרוזת, ולכן קיימת לו שיטה בשם TrimStart, שהיא שיטה הקיימת במחלקת מחרוזת. בדוגמה ניתן לראות שרשרת פונקציות שמופעלת אחת על רעותה, שמדגים תחביר פונקציונלי ב-composition (הרכבת פונקציות). ניתן לראות כי לבסוף כל התוכן מועבר לפונקציה שממירה את התוצאה ל-LIST מבלי שיועבר לה תוכן בפרמטר כלשהו.
 
<source lang="csharp">
private void DistinctAndOrderBy()
{
List<string> list1 = new List<string> {" BBB", "aaa", "hhh", " BBB", "aaa", " ZZZ", "hhh"," ZZZ" };
 
List<string> list2 = list1.Distinct().OrderBy(x => x.TrimStart()).ToList();
}
// התוכן שיתקבל ב-list2 הוא:
// list2 = aaa, BBB, hhh, ZZZ,
</source>
 
בפרדיגמה האימפרטיבית היה צריך ליצור לולאה שסורקת את כל האיברים ב-list1 ומסירה ערכים כפולים. בשלב השני היה צריך לסרוק את האיברים ולמיין אותם, או להפעיל פקודה הממיינת אותם. ולאחר מכן היה צריך לשמור את התוצאה במשתנה מסוג List.
 
{{מדעי המחשב}}