functional-programming - غرضية - امثلة على لغات البرمجة الهيكلية والغير هيكلية




ما هو النمط الحر المجاني في البرمجة الوظيفية؟ (4)

النمط الخالي من النقاط يعني أن حجج الدالة التي يتم تعريفها لا يتم ذكرها بوضوح ، والتي يتم تعريف الدالة من خلال تكوين الوظيفة.

إذا كان لديك وظيفتين ، مثل

square :: a -> a
square x = x*x

inc :: a -> a
inc x = x+1

وإذا كنت تريد دمج هاتين الدالتين في واحدة تحسب x*x+1 ، فيمكنك تعريفها "point-full" مثل:

f :: a -> a
f x = inc (square x)

البديل البديل هو عدم الحديث عن الحجة x :

f :: a -> a
f = inc . square

العبارة التي لاحظتها مؤخرًا هي مفهوم أسلوب "بدون نقطة" ...

أولاً ، كان هناك this السؤال ، وكذلك this السؤال.

بعد ذلك ، اكتشفت here أنهم يذكرون "موضوع آخر قد يكون من الجدير مناقشته هو كراهية المؤلفين لأسلوب حر."

ما هو نمط "نقطة حرة"؟ يمكن للشخص أن يعطي تفسيرا إيجازا؟ هل لها علاقة بالطبق "التلقائي"؟

للحصول على فكرة عن مستواي - لقد قمت بتدريس نظام نفسي ، وقمت بكتابة مترجم مخطط بسيط ... أفهم ما هو الكاري "الضمني" ، لكني لا أعرف أي هاسكل أو ML.


انظر إلى مقالة ويكيبيديا للحصول على التعريف الخاص بك:

إن برمجة Tacit (برمجة خالية من النقاط) هي نموذج برمجي لا يتضمن فيه تعريف الدالة معلومات تتعلق بوسائطها ، وذلك باستخدام المقتطفات وتكوين الوظيفة [...] بدلاً من المتغيرات.

مثال هاسكل:

تقليدي (تقوم بتعيين الوسائط بشكل صريح):

sum (x:xs) = x + (sum xs)
sum [] = 0

خالية من النقاط (لا يحتوي sum على أي حجج صريحة - إنه مجرد طية + تبدأ بـ 0):

 sum = foldr (+) 0

أو حتى أبسط: بدلاً من g(x) = f(x) ، يمكنك كتابة g = f .

لذلك نعم: ترتبط ارتباطًا وثيقًا بالكاري (أو العمليات مثل تكوين الوظائف).


في ما يلي مثال واحد في TypeScript بدون أي مكتبة أخرى:

interface Transaction {
  amount: number;
}

class Test {
  public getPositiveNumbers(transactions: Transaction[]) {
    return transactions.filter(this.isPositive);

    //return transactions.filter((transaction: {amount: number} => transaction.amount > 0));
  }

  public getBigNumbers(transactions: Transaction[]) {
    // point-free
    return transactions.filter(this.moreThan(10));

    // not point-free
    // return transactions.filter((transaction: any) => transaction.amount > 10);
  }

  private isPositive(transaction: Transaction) {
    return transactions.amount > 0;
  }

  private moreThan(amount: number) {
    return (transaction: Transaction) => {
      return transactions.amount > amount;
    }
  }
}

يمكنك أن ترى أسلوبًا خاليًا من النقاط هو "أكثر بطلاقة" وأسهل في القراءة.


يعني النمط المجاني للنقطة أن الرمز لا يذكر صراحةً حججها ، على الرغم من أنها موجودة ويتم استخدامها.

هذا يعمل في هاسكل بسبب طريقة عمل الوظائف.

على سبيل المثال:

myTake = take

تقوم بإرجاع دالة تأخذ وسيطة واحدة ، وبالتالي لا يوجد سبب لكتابة الوسيطة بشكل صريح إلا إذا كنت تريد ذلك أيضًا.







pointfree