سؤال

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

أولا، كان هناك هذه السؤال، و أيضا هذا واحد.

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

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

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

هل كانت مفيدة؟

المحلول

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

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

مثال Haskell:

التقليدية (تحدد الحجج بشكل صريح):

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

بدون نقطة (sum لا تملك أي حجج صريحة - إنها مجرد أضعاف + بدءا من 0):

 sum = foldr (+) 0

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

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

نصائح أخرى

يعني نمط خال من النقاط أن حجج الوظيفة المعرفة غير مذكورة صراحة، يتم تعريف الوظيفة من خلال تكوين الوظيفة.

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

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

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

وإذا كنت ترغب في الجمع بين هذين الوظيفتين إلى واحد يحسب x*x+1, ، يمكنك تحديده "نقطة كاملة" مثل هذا:

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

البديل بدون نقطة لن يتحدث عن الحجة x:

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

عينة جافا سكريبت:

//not pointfree cause we receive args
var initials = function(name) {
  return name.split(' ').map(compose(toUpperCase, head)).join('. ');
};

const compose = (...fns) => (...args) => fns.reduceRight((res, fn) => [fn.call(null, ...res)], args)[0];
const join = m => m.join();

//pointfree
var initials = compose(join('. '), map(compose(toUpperCase, head)), split(' '));

initials("hunter stockton thompson");
// 'H. S. T'

مرجع

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

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

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

myTake = take

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

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

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;
    }
  }
}

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top