# برنامه نویسی با محصولات مایکروسافت > برنامه نویسی مبتنی بر Microsoft .Net Framework > F#‎‎ > سوال: Functional Programming یعنی چی ؟

## Dariuosh

سلام
Functional Programming یعنی چی ؟
اینکه اینجوری کد بنویسیم یعنی چی ؟
یعنی چی دیگه آبجکت تعطیل ، باید فانکشنال کد کنیم یا فکر کنیم


راستی  منظورم این نیست که #F چیه ، #F ام مثله بقیه زبونا یه سینتکسی داره که اگه کسی بخواد باید یادش بگیرو استفاده کنه ؛ دونباله محسناتشم نیستم چون  واقعاً  عالیه

امیدوارم تونسته باشم دردمو بگم

----------


## m.soleimani

بسیاری از پرسش‌های شما به صورت کامل یا تا حد کامل توی همین بخش پاسخ داده شده برای مثال:

https://barnamenevis.org/showthread.p...اسبه-؟؟

https://barnamenevis.org/showthread.p...-میکند؟

https://barnamenevis.org/showthread.p...سمت-اول

https://barnamenevis.org/showthread.p...-F-چیست؟

https://barnamenevis.org/showthread.p...آموزشی-F

در کل توی بقیه سایت هم یه جستجو بکنید کلی مطلب پیدا می‌کنید اون‌هایی که مال قبل از این هست که یک بخش جدا به این زبان اختصاص پیدا کنه؛ ولی اگر به زبان انگلیسی آشنایی دارید به دنبال مطالب زبان اصلی بگردید که خیلی کامل‌تر و پله پله توضیح دادن. اگر هم به انگلیسی مسلط نیستید به نظر من از همین الان قید برنامه نویسی رو بزنید و بچسبید به یاد گیری زبان انگلیسی « این‌جوری هم دنیا رو دارید هم آخرت رو » بعد از اون شما به هر زبان برنامه نویسی که اراده کنید می‌تونید مسلط بشید البته « البته به این نکته هم دقت کنید شما پیش نیاز آشنایی با ریاضیات و دروس مرتبط رو نباید فراموش کنید » ولی برای این که واقعن یه برنامه نویس بشید دانستن زبان انگلیسی یکی از ملزومات هست شاد و پیروز باشید./

پ ن: من همیشه به صورت کلی پاسخ می‌دم که اگر دوستان دیگه هم با این مشکل رو به رو هستن یه سری نتیجه بگیرن برای خودشون و کلی هم پست تکرار توی تاپیک‌ها مختلف زده نشه.

----------


## Dariuosh

از اینکه لینکه 4تا تاپیکو کپی پیست کردی ممنوون و باز
از اینکه یادآوری کردی که زبان انگلیسی برم یاد بگیرم ممنوون

بنده مشکلی با #F ندارم ، نمیخوامم بدوونم تاریخچش چیه ، من میخوام یه مثال عملی یکی بزنه دوزاریم بیوفته  فانکشنال کد کردن یعنی چی
اگر اینجا سوالمو مطرح کردم برا این بود که جایه دیگه ایی پیدا نکردم تو سایت

----------


## Dariuosh

#F سه تا حسن  عمده داره
1- سادگی سینتکس و به طبع اون کد نویسی (Simplicity)
    2- اقتصادی بودن (Economics)
    3- محاسبات موازی (Parallel)

به عنوان مثال فرض کنید 
 میخوایم یه پابلیک پراپرتی به نام a داشته باشیم که شامل عدد مشخصیه ، بعدشم چاپش کنیم 


//C#‎
using System;
namespace ConsoleApplication1
{
    class Program
    {
        static int a()
        {
            return 2;
        }
        static void Main(string[] args)
        {
            Console.WriteLine(a());
        }
    }
}



//F#‎
open System
let a = 2
Console.WriteLine a

دیگه خبری از نیم اسپیسو ، کلاسو ، تایپ متغیرو  یه مشت آکولادو اینا نیست 


راستی این let هم یکی پرکاربردترین دستوورات #F 

مثلاً دوم


//C#‎
abstract class Command
    {
        public virtual void Execute();
    }
    abstract class MarsRoverCommand : Command
    {
        protected MarsRover Rover { get; private set; }
 
        public MarsRoverCommand(MarsRover rover)
        {
            this.Rover = rover;
        }
    }
    class BreakCommand : MarsRoverCommand
    {
        public BreakCommand(MarsRover rover)
            : base(rover)
        {
        } 
        public override void Execute()
        {
            Rover.Rotate(-5.0);
        }
    }
 class TurnLeftCommand : MarsRoverCommand
    {
        public TurnLeftCommand(MarsRover rover)
            : base(rover)
        {
        }
        public override void Execute()
        {
            Rover.Rotate(-5.0);
        }
    }



//F#‎
type Command = Command of (Rover -> unit)
let BreakCommand     =     Command(fun rover -> rover.Accelerate(-1.0))
let TurnLeftCommand  =     Command(fun rover -> rover.Rotate(-5.0<degs>))

مختصر مفید

راستی کدایه #Fاو تو چی بزاریم که خوشگل نشوون بده ؟

----------


## cardano7

> بسیاری از پرسش‌های شما به صورت کامل یا تا حد کامل توی همین بخش پاسخ داده شده برای مثال:
> 
> https://barnamenevis.org/showthread.p...اسبه-؟؟
> 
> https://barnamenevis.org/showthread.p...-میکند؟
> 
> https://barnamenevis.org/showthread.p...سمت-اول
> 
> https://barnamenevis.org/showthread.p...-F-چیست؟
> ...


راستش خیلی از جواب هایی که نه فقط در این فروم داده می شوند، که حتی در فروم هایی مثل کدپراجکت، دارای یک عیب بسیار بزرگ هستند. منظور من فقط شخص شما نیستید و لطفا از این که نوشته ی شما را نقل قول کردم ناراحت نشوید. ایراد بزرگ این هست که تمامی این جواب ها حاوی جواب هستند اما جواب آن سوال نیستند. 
در خیلی از پست های دیگر هم سوال کننده می پرسد که زبان برنامه نویسی تابعی چیست و در جواب دوستان توضیح می دهند که اف شارپ چیست. می دانیم اف شارپ خیلی قابلیت ها و کاربردها دارد و می دانیم خیلی شرکت ها از اف شارپ استفاده می کنند اما این پاسخ سوال "زبان برنامه نویسی تابعی چیست؟" را نمی دهد. 
تمامی لینک های شما را دیدم و هیچ یک به تنها چیزی که اشاره نمی کند همین است. شاید 5 خط برای توضیح این موضوع کافی باشد اما آنها پارگراف ها(گاه کپی از منابع تکراری) در باره ی تاریخچه و 1000 چیز دیگر در مورد اف شارپ می نویسند الا اینکه زبان برنامه نویسی تابعی چیست. در فروم هایی نظیر کد پراجکت که یوزر ها بی تربیت هم هستند و گاه کار برخی این هست که هر کس هر سوالی پرسید فوری جواب دهند که "google it" غافل از اینکه اگر گوگل جواب سوال را می داد کسی پستی را ایجاد نمی کرد که چنین سوالی را بپرسد. گاهی هم برخی یوزرها عادت دارند که گوگل کنند و لینک اولین نتیجه را به عنوان پاسخ مطرح کنند و بعد سرکوفت بزنند که چرا گوگل نمی کنید. غافل از اینکه خود او اصلا نه سوال را می فهمد و نه جواب را. منظور من شما نیستید اما این لینک ها مرا یاد خاطراتی از کدپراجکت انداخت.
چند کیلومتری انشاهای این لینک ها را خواندم و آخر سر همچنان برای من یک سوال بافی مانده است، که زیان برنامه نویسی تابعی چیست؟
یقینا ما نمی خواهیم یک کتاب بخوانیم تا جواب این سوال را دریابیم.
لطفا اگر کسی می تواند، تنها در چند خط جواب این سوال را بدهد.

----------


## cardano7

من در حال خواندن کتاب #Programming F از انتشارات O’Reilly هستم. در فصل سوم کتاب تعریف برنامه نویسی تابعی به این شکل آمده:



> For a language to be considered “functional,” it typically needs to support a few key features: 
> 
> Immutable dataAbility to compose functionsFunctions can be treated as dataLazy evaluationPattern matching

----------


## Dariuosh

سلام 
دیدنشوون خالی از لطف نیست

C9 Lectures: Dr. Don Syme - Introduction to F#‎‎

----------


## mr AHR

ببینم اگر Functional خوبه پس چرا اینقدر Windows API که تابع تابعه آدمو زجر میده ؟؟؟

----------


## mohammadsepehri

* 					نقل قول: منابع آموزشی #F 				*

 							با سلام -کتاب جدید آموزشی اف شارپ با امکانات خیلی زیاد از انتشارات دیباگران منتشر شده است . لینک خرید کتاب هم  اینه :
http://www.mftshop.com/productdetail...type=b&id=7608
پیشنهاد میکنم امتحان کنید .

----------


## molanagezadeh

با سلام و تشکر 
میشه این مثال دوم که زدین  هم #c و هم #f  کدهاش رو بهم توضیح بدین .ممنون میشم

//C#‎‎‎
abstract class Command
    {
        public virtual void Execute();
    }
    abstract class MarsRoverCommand : Command
    {
        protected MarsRover Rover { get; private set; }

        public MarsRoverCommand(MarsRover rover)
        {
            this.Rover = rover;
        }
    }
    class BreakCommand : MarsRoverCommand
    {
        public BreakCommand(MarsRover rover)
            : base(rover)
        {
        } 
        public override void Execute()
        {
            Rover.Rotate(-5.0);
        }
    }
 class TurnLeftCommand : MarsRoverCommand
    {
        public TurnLeftCommand(MarsRover rover)
            : base(rover)
        {
        }
        public override void Execute()
        {
            Rover.Rotate(-5.0);
        }
    }


//F#‎‎‎
type Command = Command of (Rover -> unit)
let BreakCommand     =     Command(fun rover -> rover.Accelerate(-1.0))
let TurnLeftCommand  =     Command(fun rover -> rover.Rotate(-5.0<degs>))

----------


## govaleshgar2

یعنی عاشق این ملتم، یارو اومده در مورد functional programming سوال کرده، بعد راجع به F#‎‎‎ حرف میزنید؟ (فقط cardano7 جواب مرتبط داده و بقیه حرف مفت زدید.)

اما اینکه functional programming چیه؟
*جواب ساده این سوال اینه که function شهروند درجه یک برنامه نویسی میشه*. به عبارتی دیگر در یک زبان برنامه نویسی FP شما قدرت *کار بیشتری برای سر و کله زدن با function ها* دارید(حتی از قدرت عمل شما در جاهایی کاسته میشود تا بتواند با function ها بهتر و قوی تر کار کنید.)

*مثالهایی از مفهوم "شهروند درجه یک بودن function"*

دو قابلیت زیر که قابلیتی هستند که معمولاً فقط در زبانهای functional یافت میشوند:

1 - یکی از کارهایی که میتونید در زبان FP بکنید اینه با function به صورت داده رفتار کنید(مثلاً به عنوان ورودی و یا خروجی method ها یک function را رد و بدل کنید.) (این قابلیت در F#‎‎‎ و C#‎‎‎ هر دو وجود دارد)
2 - یکی دیگه از قابلیتهای زبانهای functional اینه که میتونید function را به صورت جزئی فراخوانی کنید و یک function دیگر در خروجی بگیرید. (مثلاً اگر تابع X دو پارامتر a و b دارد در زبانی مانند Java تنها حالتی که میتونید این تابع را صدا بزنید این است که هر دو پارامتر a و b را مقدار دهی کنید. اما در یک زبان functional مانند F#‎‎‎ شما میتوانید فقط مقدار پارامتر a را بدهید و چون هنوز مقدار b را مشخص نکرده اید در خروجی یک تابع میگیرید که یک پارامتر b دارد و اگر آن را صدا بزنید مانند این است که تابع X را صدا زده اید.) - این قابلیت در F#‎‎‎ وجود دارد و در JavaScript به نوعی قابل انجام است.

*مثال از محدودیت زبان functional در راستای پشتیبانی بهتر از مفهموم "شهروند درجه یک بودن function"*
معمولاً زبانهای functional دارای این محدودیت هستند که مفهومی با نام متغیر ندارند(آره منظورم variable است) چون در این زبانها ماهیت function بیشتر به تعریف ریاضی آن نزدیک است. در این زبانها function دارای side effect نیست بلکه فقط و فقط دارای ورودی و خروجی است و در بدنه آن فقط محاسبات صورت میگیرد و نه عملیات. محاسبات هم به صورت اجرای توابع و عملگرهای مختلف بر روی ورودی و تولید مقادیر موقت داخلی و انجام مکرر توابع عملگرها و توابع بر روی مقادیر موقت داخلی و در نهایت تولید مقدار خروجی پیش میرود.


اینها نمونه ای از مفاهیمی بود که امیدوارم کمک کند تا تصویری از تفارت زبانها functional و سایر زبانها داشته باشی. البته چون این مفاهیم کمی سخت هستند(حتی برای خودم) و من هم خودم خیلی مسلط نیستم، این جواب من جامع و کامل نیست و فقط به امید اینکه ایده ای ارائه کرده باشم این رو نوشتم.

در ضمن "object تعطیل" لفظ درستی نیست. اگر منظورتون اینه که object مطرح نیست، باید بگم به طور مثال در زبانی مثل F#‎‎‎ چون چندپارادایم هست(multi paradigm) همچنان هم object oriented programming قابل انجامه و هم functional programming. ولی در زبانهای pure functional به طور کلی خبری از مفهوم object نیست.

----------

