يجب أن تكون لغة تنفذ مكتوبا قانونيا؟
-
23-08-2019 - |
سؤال
أنا أتعلم نمط البرمجة الوظيفية. في لا تخف من الملاحات, ، أعطى براين بيكمان مقدمة رائعة عن موناد. وذكر أن موناد يدور حول تكوين الوظائف لمعالجة التعقيد.
مناد يشمل
unit
الوظيفة التي تنقل نوع T إلى نوع مضخم M (T)؛ وظيفة الربط التي تعطى وظيفة من T إلى M (U)، يحول نوع M (T) إلى نوع آخر M (U). (يمكنك أن تكون ر، ولكن ليس بالضرورة).
في فهمي، يجب فحص اللغة المنفذة من لغة موناد بشكل ثابت. خلاف ذلك، لا يمكن العثور على أخطاء الكتابة أثناء التجميع ولم يتم التحكم في "التعقيد". هل فهمي صحيح؟
المحلول
هناك الكثير من تطبيقات المنظمة في اللغات المكتوبة بشكل حيوي:
- ربما مناد في روبي
- oo monads و ruby (الموقع إلى أسفل، ولكن المقال متوفر في آلة Wayback Archive على الإنترنت)
- منادس في روبي الجزء 1: الهوية, منادس في روبي الجزء 1.5: الهوية, منادس في روبي الجزء 2: ربما (ثم مرة أخرى ربما لا)
- منادس في روبي
- monads على الرخيص الأول: ربما مناد في جافا سكريبت, المزيد من الموصلات الرخيصة: مغمور من Maybe
- منادس في روبي (مع بناء جملة لطيفة!), قائمة مناد في روبي وبيثون
- هاسكل على طراز موناد دو-تدوين روبي
بشكل عام، فإن أطروحة تورينج الكنيسة تخبرنا أن كل ما يمكن القيام به في واحد يمكن أيضا القيام باللغة في كل شيء آخر لغة.
كما يمكنك أن تخبر عن اختيار الأمثلة أعلاه، أنا (في الغالب) مبرمج روبي. لذلك، تماما مثل مزحة، أخذت واحدة من الأمثلة أعلاه وإعادة تنفيذها بلغة أعرفها لا شيء مطلقا حول، يعتقد أنه عادة بلغة قوية للغاية، وهذا يبدو أن لغة البرمجة الوحيدة على هذا الكوكب الذي لم أكن قادرا على العثور على برنامج تعليمي من موناد. هل لي أن أقدم لك ... الهوية مناد في PHP:
<?php
class Identity {
protected $val;
public function __construct($val) { $this->val = $val; }
public static function m_return($a) { return new Identity($a); }
public static function m_bind($id_a, $f) { return $f($id_a->val); }
}
var_dump(Identity::m_bind(
Identity::m_return(1), function ($x) {
return Identity::m_return($x+1);
}
));
?>
لا توجد أنواع ثابتة، ولا عامة، لا إغلاق ضرورية.
الآن، إذا كنت ترغب في الواقع في الاختيار الشيكات، فأنت بحاجة إلى نظام نوع ثابت. ولكن هذا هو أكثر أو أقل تدوين: إذا كنت ترغب في التحقق من الأنواع القانونية، فأنت بحاجة إلى مدقق نوع ثابت. ده.
فيما يتعلق بسؤالك:
في فهمي، يجب فحص اللغة المنفذة من لغة موناد بشكل ثابت. خلاف ذلك، لا يمكن العثور على أخطاء الكتابة أثناء التجميع ولم يتم التحكم في "التعقيد". هل فهمي صحيح؟
أنت على حق، ولكن هذا لا علاقة له مع المانز. هذا هو مجرد التحقق من نوع ثابت بشكل عام، وتطبق على قدم المساواة إلى صفائف أو قوائم أو حتى أعداد صحيحة مملة عادية.
هناك أيضا رنجة حمراء هنا: إذا نظرت إلى مثال في تطبيقات موناد في C #، جافا أو ج، فهي أكثر تعقيدا بكثير وأكثر تعقيدا من، على سبيل المثال، كما يقول مثال PHP أعلاه. على وجه الخصوص، هناك طن من أنواع في كل مكان، لذلك بالتأكيد تبدو بديع. ولكن الحقيقة القبيحة هي: C #، أنظمة جافا ونوع جافا و C ليست قوية بما يكفي للتعبير عن نوع Monad
. وبعد خاصه، Monad
هو نوع متعدد الألوان المرتبة 2، ولكن C # و Java يدعم فقط مرتبة - 1 تعدد الأشكال (يسمونه "Generics"، لكنه نفس الشيء) و C لا يدعم ذلك حتى.
لذلك، هي في الواقع ليس يتم فحص نوع ثابت في C #، Java و C. (هذا هو السبب وراء تعريف اختصاصات LinQ Monad كأنما نمط وليس كأداة: لأنك ببساطة لا تستطيع يعبر النوع في C #.) كل نظام النوع الثابت، يجعل التنفيذ أكثر تعقيدا، دون المساعدة في الواقع. يتطلب نظام نوع أكثر تطورا بكثير مثل Haskell's، للحصول على سلامة من النوع الفعلي للمهن.
ملاحظة: ما كتبته أعلاه فقط ينطبق على عامة monad
اكتب نفسها، كما يشير شروط. يمكنك بالتأكيد التعبير عن نوع أي محدد مناد، مثل List
أو Maybe
, ، لكن لا يمكنك التعبير عن نوع Monad
بحد ذاتها. وهذا يعني أنه لا يمكنك كتابة التحقق من حقيقة أن "List
هو Monad
"، ولا يمكنك كتابة العمليات العامة التي تعمل على جميع مثيلات Monad
.
(لاحظ أن التحقق من ذلك Monad
يطيع أيضا مناد القوانين بالإضافة إلى المطابقة مع الماناد اكتب ربما الكثير حتى بالنسبة لنظام نوع Haskell. من المحتمل أنك تحتاج إلى أنواع معتمدة وربما حتى نظرية التلقائية التلقائية بالكامل.)
نصائح أخرى
بالتأكيد ليس هو الحال التي تنفذ لغةها يجب تكون مكتوبة قانونيا، حيث يسأل عنوان سؤالك. قد تكون فكرة جيدة، لأسباب توضحها، ولكن الأخطاء التي فشلت في اكتشافها في وقت الترجمة لم تتوقف عن أي شخص. فقط انظر إلى عدد الأشخاص الذين يكتبون PHP.
تحتاج إلى إغلاق الدولة مناد. لقد بحثت عنها، PHP بإغلاق منذ 5.3. لذلك لن تكون مشكلة بعد الآن.
لا، في PHP لا يمكن تنفيذ الموصلات. تحتاج إلى إغلاق لذلك. أبدا أقل، فإن مفهوم ربما لا يزال لا يزال مفيدا، عندما تحاكي مطابقة نمط مع الفصول:
abstract class Maybe {
abstract public function isJust();
public function isNothing(){
return !$this->isJust();
}
}
class Just extends Maybe {
protected $val = null;
public function __construct($val){
$this->val = $val;
}
public function isJust(){
return true;
}
public function getVal(){
return $this->val;
}
}
class Nothing extends Maybe {
protected $val = null;
public function __construct(){
}
public function isJust(){
return false;
}
}
function just(){
print "isJust";
}
function nothing(){
print "nothing";
}
function MaybeFunc(Maybe $arg){
if(get_class($arg) == 'Just'){
print "Just";
} else {
print "Nothing";
}
}
MaybeFunc(new Just(5));
MaybeFunc(new Nothing());