پارادایم برنامهنویسی | چندپارادایم: تابعی، استاتیک |
---|---|
.sml | |
.sml | |
وبگاه | |
پیادهسازیهای بزرگ | |
MLKit, MLton, MLWorks, Moscow ML , Poly/ML , SML/NJ, MLj, SML.NET | |
گویش | |
Alice, Concurrent ML, Dependent ML | |
متأثر از | |
ML, Hope | |
تأثیر گذاشته بر | |
Elm, F*, OCaml, Rust, Scala |
استاندارد امال (به انگلیسی: Standard ML) یا SML یک زبان برنامهنویسی همه منظوره مدولار، تابعی با بررسی همزمان هنگام کامپایل و تشخیص خودکار نوع متغیرها است. این زبان برنامهنویسی در میان نویسندههای کامپایلر و محققان زبان برنامهنویسی و در اثبات قضیه خودکار محبوبیت دارد.
استاندارد امال یک زبان برنامهنویسی تابعی با برخی ویژگیهای ناخالص است. برنامههای نوشته شده به زبان استاندارد امال شامل عبارتهایی برای ارزیابی هستند. بر خلاف دستورها برنامهنویسی معمول، برخی از عبارتها یک مقدار واحد را بازمیگردانند. برخی از آنها نیز تنها برای تأثیرهای جانبی ارزیابی میشوند.
مثل همه زبانهای برنامهنویسی تابعی، توابع یک ویژگی کلیدی استاندارد امال هستند که برای انتزاع استفاده میشوند. برای مثال تابع فاکتوریل میتواند به صورت زیر بیان شود:
fun factorial n =
if n = 0 then 1 else n * factorial (n-1)
کامپایلر استاندارد امال نوع int -> int برای این تابع را بدون وارد کردن نوع متغیرها توسط کاربر باید تفسیر کند. به عبارت دیگر کامپایلر وظیفه دارد تا تفسیر کند که n تنها همراه با عبارات INT میتواند استفاده شود، بنابراین نوع n نیز باید از نوع INT بوده و همه مقادیر برگشتی از تابع فوق نیز از همین نوع باشند.
تابع فاکتوریل میتواند به صورت شروط اگر-آنگاه در قالب دنبالهای از توابع فاکتوریل که به صورت شکل قالب مانند بیان شدهاند، نیز تعریف شود. این توابع با '|' از یکدیگر متمایز میشوند و به صورت چسبیده به یکدیگر تعریف میشوند.
fun factorial 0 = 1
| factorial n = n * factorial (n - 1)
که میتواند با استفاده از عبارات case نیز به صورت زیر بازنویسی شود:
val rec factorial =
fn n => case n of 0 => 1
| n => n * factorial (n - 1)
و یا با استفاده از تابع لامبدا:
val rec factorial = fn 0 => 1 | n => n * factorial(n -1)
با استفاده از یک تابع محلی، تابع فاکتوریل میتواند به صورت بهینهتری بازنویسی شود:
fun factorial n = let
fun lp (0, acc) = acc
| lp (m, acc) = lp (m-1, m*acc)
in
lp (n, 1)
end
مابین عبارت let و in تابع lp تعریف میشود و هنگام فراخوانی تابع فاکتوریل (بین عبارت in و end) اجرا میشود.
ترجمهٔ ویکیپدیا انگلیسی