【转】从简单的 F# 表达式构建并发应用程序
本文将介绍以下内容:
|
本文使用了以下技术: F# |
函数式编程
异步表达式
使用 let!和 return!
基元
创建自己的基元
基元和支持函数
将异步调用扩展到 Web
使用其他 .NET 语言
commandOne(); commandTwo(); commandThree();
commandOne() | commandTwo() | commandThree()
async {commandOne()}; async {commandTwo()}; async {commandThree()}
x = first( async { commandOne() };async { commandTwo() }; async { commandThree()}; )
#light System.Console.WriteLine "Hello World"
let x = 2
let x = 2 + 3
let emit:string->unit = System.Console.WriteLine
emit "Hello World"
Hello World
emit("Hello World")
let emitter () = emit "Hello World" emitter ()
"Hello World"
#light open System.IO open System let countSpace filename size = let space = Convert.ToByte ' 'use stream = File.OpenRead filenamelet bytes = Array.create size spacelet nbytes = stream.Read (bytes,0,size)let count = bytes|> Array.fold_left (fun acc x -> if (x=space) then acc + 1 else acc) 0count let files = (DirectoryInfo @"C:\Users\Chance\Documents").GetFiles "*.txt" let counted = files |>Array.map (fun f -> countSpace (f.FullName) (int f.Length))
open Microsoft.FSharp.Control.CommonExtensions #nowarn "057" let aCountSpace filename size = async {let space = Convert.ToByte ' 'use stream = File.OpenRead (filename)let bytes = Array.create size spacelet! nbytes = stream.ReadAsync (bytes,0,size)let count = bytes|> Array.fold_left (fun acc x -> if (x=space) then acc + 1 else acc) 0return count}
let aCounted = files|> Array.map (fun f -> aCountSpace (f.FullName) (int f.Length))|> Async.Parallel |> Async.Run
async { return 1}
let x = async {return 1} let y = async { let res = x return 5 + res } // TYPE ERROR
let x = async { return 1} let y = async { let! res = x return 5 + res } // WORKS! Async.Run y
let x = async { return 1} let y = async { return! x}
let x = async {return 1} let y = async { let! temp = xreturn temp }
let one = async { return 1 }
let nums = [|async {return 1 + 1}; async {return 1+ 2}; async {return 1 + 3}|]Async.Run (Async.Parallel nums)
if ( a || b) {Console.WriteLine("A and B were true");}else { Console.WriteLine("Either A or B was false");}
#light #r "TerraService.dll" #nowarn "57" open System open System.Xml open System.Xml.Serialization open System.IO open Microsoft.FSharp.Control open Microsoft.FSharp.Control.CommonExtensions open WebReferences
type 'a Result =| Complete of 'a| Failure of 'atype 'a RetrievedValue =| File of 'a| Web of 'a| Timeout| Errorlet ts = new TerraService()
let updateAndContinue n i cont res = lock n (fun () -> if !n = -1 then n:=i)if (!n=i) then cont reslet aContinueFirstSuccess cont n i x =async { let! y=x indo match y with | Complete(res) -> updateAndContinue n i cont res| _ -> () }let continueIfFirst cont n i x = Async.Spawn (aContinueFirstSuccess cont n i x)let first (ls:Async<'a Result> List) = Async.Primitive (fun (cont,exn) -> let n = ref (-1) in List.iteri (continueIfFirst cont n ) ls)
let timeout i x = async {do System.Threading.Thread.Sleep(i:int)return Complete(x) }
let terminateInSeconds time zero expr = let success = async {let! res = exprreturn Complete(res)}first [ success; timeout (1000*time) zero]
let rec countdown x = async {do Console.WriteLine(x:int)do System.Threading.Thread.Sleep(1000)if x = 0 then return Complete("Done")else let! res = first [ countdown (x-1);timeout ((x-1) * 1000) "Launch"]return Complete(res)}
> Async.Run (countdown 5);; 5 4 3 2 1 0 val it : string Result = Complete "Launch"
type TerraService withmember ts.AsyncGetPlaceFacts(p) =Async.BuildPrimitive((fun (callback,asyncState) -> ts.BeginGetPlaceFacts (p,callback,asyncState)),ts.EndGetPlaceFacts)let aGetPlaceWeb (city,state,country) = async {let p = new Place(City=city, State=state, Country=country)let! facts = ts.AsyncGetPlaceFacts(p)do savePlace factsreturn Complete(Web(facts.Center ))}
let aGetPlaceFile placeVals = async {let name = nameFromTriple placeValsif File.Exists(name) thenlet coord = coordFromFile namereturn Complete(File(coord))else return Failure(Error)}
let greatPlaces = [ ("Austin","Texas","United States");("Las Vegas","Nevada","United States");("Asheville","North Carolina","United States");("Arlington","Virginia","United States");("Laguna Beach","California","United States")] let getWebPlaces = List.map aGetPlaceWeb greatPlaces let getFilePlaces = List.map aGetPlaceFile greatPlaces
let combineAsyncFirst l1 l2 = List.map (fun (one,two) -> first [one;two]) (List.combine l1 l2)let combined = (combineAsyncFirst getWebPlaces getFilePlaces)let firstPlaces = List.map (terminateInSeconds 3 Timeout) combinedlet e = Async.Parallel firstPlaceslet result = Async.Run e
let e = Async.Parallel firstPlaces
type GreatPlaces() = let places = List<(string * string * string)>()member self.AddPlace(city,state,country) = places.Add( (city,state,country) )member self.RetrievePlaces () = let lplaces = List.of_seq placeslet result = runPlaces lplacesArray.combine (Array.of_seq places) result |> Array.map compileResultToken
> wsdl /namespace:WebService http://terraservice.net/terraservice.asmx Microsoft ® Web Services Description Language Utility Writing file 'c:\dev\TerraService.cs' >csc /target:library TerraService.cs
#r "TerraService.dll"
转载于:https://www.cnblogs.com/JosephLiu/archive/2011/11/04/2236498.html
【转】从简单的 F# 表达式构建并发应用程序相关推荐
- C#中利用Linq.Dynamic实现简单的动态表达式构建查询
背景介绍 在ADO.NET中我们可以根据用户输入的查询条件拼接出指定的SQL语句进行查询或者筛选出所需的数据,但是在ORM框架如EF中,我们一般用LINQ操作数据查询,LINQ是否可以像SQL一样拼接 ...
- Java8函数式编程_9--使用Lambda表达式编写并发程序
1,免责声明,本文大部分内容摘自<Java8函数式编程>.在这本书的基础上,根据自己的理解和网上一些博文,精简或者修改.本次分享的内容,只用于技术分享,不作为任何商业用途.当然这本书是非常 ...
- 36.求解简单的四则运算表达式,输入一个形式如“操作数 运算符 操作数”的四则运算表达式,输出运算结果
36.求解简单的四则运算表达式,输入一个形式如"操作数 运算符 操作数"的四则运算表达式,输出运算结果 #include<stdio.h> int main() {fl ...
- 计算机网络套接字编程实验-TCP多进程并发服务器程序与单进程客户端程序(简单回声)
1.实验系列 ·Linux NAP-Linux网络应用编程系列 2.实验目的 ·理解多进程(Multiprocess)相关基本概念,理解父子进程之间的关系与差异,熟练掌握基于fork()的多进程编程模 ...
- python中F/f表达式优于format()表达式
F/f表达式可以解析任意类型的数据 具体实现,看下面示例: 1.解析变量 a = 10 b = 20 res1 = F"a+b的值:{a+b}" print(res1) 结果: a ...
- boost::proto模块实现简单的算术表达式求值器的测试程序
boost::proto模块实现简单的算术表达式求值器的测试程序 实现功能 C++实现代码 实现功能 boost::proto模块实现简单的算术表达式求值器的测试程序 C++实现代码 #include ...
- java数学计算表达式_Java初学者:内建函数计算简单的数学表达式
这个应该在之前写的,忘记了,补上 这次我们说一下如何用java计算数学表达式的值,比如,我们要计算sin(pi/3) + cos(pi/6) + 5.6^3,怎么计算呢?这里我们需要用到java的ma ...
- 波兰表达式 构建 表达式树
这里提供一种将波兰表达式构建成表达式树的一种方法. 二叉树的节点有三个成员:数值(或者操作符)type,左节点lnode(被操作数),右节点rnode(操作数) //借助栈将波兰表达式 构建 表达式树 ...
- 使用Beetle简单构建聊天室程序
之前已经讲解了Beetle简单地构建网络通讯程序,那程序紧紧是讲述了如何发送和接收数据:这一章将更深入的使用Beetle的功能,主要包括消息制定,协议分析包括消息接管处理等常用的功能.为了更好的描述所 ...
- laytpl语法_浅谈laytpl 模板空值显示null的解决方法及简单的js表达式
浅谈laytpl 模板空值显示null的解决方法及简单的js表达式 laytpl 模板语法 {{ d.field }} 输出一个普通字段,不转义html 官方的说明 但d.field 为空时会显示nu ...
最新文章
- jQuery Callbacks
- react native 的TextInput组件问题
- JAVA相关基础知识(一)
- Hadoop报错AccessControlException: Permission denied: user=vincent, access=WRITE, inode=/:iie4bu:supe
- 使用 case when进行行列转换
- 数据分析-书籍整理(二)
- 使用duilib开发半透明异形窗体程序(附源码和demo)
- php 弹出指定窗口大小,弹出div或者弹出新窗口的固定位置、固定大小
- oracle回滚断查询,Oracle回滚段使用查询代码详解
- 网络的小区号和网络tac_网络问政|城基路老旧小区排污管长期堵塞没人管?
- SM2算法第十篇:数字证书及CA的扫盲介绍
- 实战-Android开机时间优化
- 你也认为技术总监应懂技术细节,那就有些可悲了
- 百度天眼android,百度天眼下载|百度天眼安卓版 v1.2.0.20423_手机天堂
- ue模糊查询_Daizyue的Power Query学习笔记-缓存
- 两组的数据平均值合并_数据平均值合并计算 合并计算求平均值
- 用python刷网页浏览量_使用python刷文章阅读量
- %在C语言计算中的用法
- 【深度学习实战04】——SSD tensorflow图像和视频的目标检测
- 计算两个日期的相隔天数
热门文章
- Django 系列博客(二)
- CSS3过渡动画关键帧动画
- 删除none的images
- [Machine Learning]朴素贝叶斯(NaiveBayes)
- ubuntu 14.04 将用户目录下中文目录修改为英文目录
- VC++6.0 DDK 环境配置
- (tip_修订0618)bmp 32位转24位
- 【c++基础】菱形继承问题
- java day57【 Spring 概述 、 IoC 的概念和作用、使用 spring 的 IOC 解决程序耦合 】...
- C++ string用法