عملیاتهای پایهی توانایی Stream را پیادهسازی کنید.
در زبانهای تابعی، توابعی مانند filter، map و reduce بسیار رایجاند. مجموعهای از ترکیبکنندههای تابعی پایه را برای یک توانایی جریان پیادهسازی کنید، بدون آنکه از توابع موجود استفاده کنید. برای این کار باید میزانکنندههای توانایی خودتان را بنویسید.
💡 قرار است این توانایی را MyStream بنامیم تا با توانایی Stream موجود در کتابخانهی استاندارد تعارضی پیش نیاید.
عملیاتهایی که باید پیادهسازی کنید عبارتاند از:
MyStream.fromList (با گرفتن یک فهرست از عناصر، جریانی از عناصر بسازید)MyStream.toList (با گرفتن یک جریان از عناصر، آن را به یک فهرست تبدیل کنید)MyStream.toListWithResult (با گرفتن یک جریان از عناصر، آن را همراه با نتیجهی تابع جریان به یک فهرست تبدیل کنید)MyStream.ignore (با گرفتن یک جریان از عناصر، مقادیر منتشرشده را نادیده بگیرید و نتایج تابع جریان را برگردانید)MyStream.filter (با گرفتن یک محمول و یک MyStream، MyStreamای از همهی عناصری را برگردانید که predicate(item) برای آنها «درست» است)؛MyStream.map (با گرفتن یک تابع و یک MyStream، MyStreamای از نتایج اعمال function(item) روی همهی عناصر را برگردانید)؛MyStream.flatMap (با گرفتن تابعی که یک MyStream تولید میکند و یک MyStream، MyStreamای از نتایج اعمال function(item) روی همهی عناصر را برگردانید)Stream
Stream یک ability در Unison است که برای انتشار مقادیر به کار میرود.
اگر تابعی دارید که باید هنگام فراخوانی، مقادیر را بهعنوان یک اثر جانبی تولید کند، ممکن است از ability Stream استفاده کنید. برای مثال، این تابع آخرین مقدار فهرست را برمیگرداند، اما با دیدن هر عنصر، جمع جاری را منتشر میکند:
emitRunningTotal : '{Stream Nat} Nat
emitRunningTotal = 'let
use Nat +
List.foldLeft (
acc a -> let
runningTotal = acc + a
Stream.emit runningTotal
a
) 0 [1,2,3,4,5]
میتوانیم با یک ability handler، Stream را بهصورت یک List و همراه با مقدار بازگشتی تابعی که آن را تولید میکند، درآوریم:
> Stream.toListWithResult! emitRunningTotal
⧩
([1, 3, 5, 7, 9], 5)