我正在使用F#和Chessie来编写一系列可以成功或失败的任务(有副作用).
如果有任何失败,我想停止执行剩余的任务并回滚那些已经成功的任务.
不幸的是,一旦我遇到"失败"路径,就不再有办法检索成功任务的结果,所以我可以回滚它们.
是否存在处理此场景的函数式编程"模式"?
例:
let refuel =
async {
printfn "1 executed"
// Fill missile with fuel
return Result<string,string>.Succeed "1"
} |> AR
let enterLaunchCodes =
async {
printfn "2 executed"
//
return Result<string,string>.FailWith "2"
} |> AR
let fireMissile =
async {
printfn "3 executed"
return Result<string,string>.Succeed "3"
} |> AR
let launchSequence =
asyncTrial {
let! a = refuel
let! b = enterLaunchCodes
let! c = fireMissile
return a,b,c
}
let result = launchSequence
|> Chessie.ErrorHandling.AsyncExtensions.Async.ofAsyncResult
|> …
Run Code Online (Sandbox Code Playgroud) 使用let有一些限制!里面的比赛声明?我不确定为什么这不会编译.
module Foo =
let Bar =
async {
let result =
match 1 with
| 1 ->
let! num = async.Return 12345 // Doesn't compile
1
| _ -> 2
return result
}
Run Code Online (Sandbox Code Playgroud)
编译失败,"此构造只能在计算表达式中使用"
对于F#中的大多数运算符,我可以使用前缀或中缀表示法,例如:
let x = a + b
Run Code Online (Sandbox Code Playgroud)
相当于
let x = (+) a b
Run Code Online (Sandbox Code Playgroud)
但这不适用于指数运算符**,因为括号内的版本被视为注释.也就是说,(*这是注释*)是注释的F#语法,因此(**)被视为空注释.
let x = a ** b // a raised to b
let x = (**) a b // empty comment, followed by function a applied to b
Run Code Online (Sandbox Code Playgroud)
有没有我可以使用的逃脱角色,或者这只是一种奇怪的语言怪癖?
我创建了一个 htmlhelper 扩展来减少创建表单时的重复标记量:
public static MvcHtmlString RenderField<TModel, TValue>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TValue>> expression)
{
return htmlHelper.DisplayFor(expression, "formfield");
}
Run Code Online (Sandbox Code Playgroud)
这个想法是,在我的视图中,我可以只写@Html.RenderField(x=>x.MyFieldName)
,它就会打印标签和字段的内容,并div
已放置适当的标签。
在 displaytemplates 文件夹中,我创建了 formfield.cshtml,其中包含以下内容:
<div class="display-group">
<div class="display-label">
@Html.LabelFor(x => x)
</div>
<div class="display-field">
@Html.DisplayFor(x => x)
</div>
</div>
Run Code Online (Sandbox Code Playgroud)
不幸的是,似乎不可能将 DisplayFor 嵌套在显示模板中(它不渲染任何内容)。我不想只是使用,@Model
因为那样我就不会得到布尔值的复选框、日期的日历控件等。
有没有好的办法解决这个问题?
是否有可能使用websharper作为javascript的替代品,而不会增加sitelets或ASP.NET的复杂性?
例如,我可以将以下的websharper库编译为.js文件,并在我的html中的javascript脚本块中调用hello()函数吗?
namespace WebSharperLib
open IntelliFactory.WebSharper
module HelloWorld =
[<JavaScript>]
let hello () =
IntelliFactory.WebSharper.JavaScript.Alert("Hello World")
Run Code Online (Sandbox Code Playgroud) 是否可以在Akka.Net actor计算中的Async <'t>上等待(不阻塞)?我想实现类似以下的东西.
actor {
let! msg = mailbox.Receive()
match msg with
| Foo ->
let! x = async.Return "testing 123" // Some async function, return just an example
() // Do something with result
}
Run Code Online (Sandbox Code Playgroud) 是否可以在F#中重载操作符,其中操作数是函数?
例如(使用Chessie):
module AsyncTrialOperators =
type Ops=
/// Left-to-right Kleisli composition
static member (>=>) (f:'a -> AsyncResult<'b,_>, g:'b -> AsyncResult<'c,_>) =
fun x ->
asyncTrial {
let! y = f x
let! z = g y
return z }
/// Left-to-right Kleisli composition
static member (>=>) (f:'a -> AsyncResult<'b,_>, g:'b -> Result<'c,_>) =
fun x ->
asyncTrial {
let! y = f x
let! z = g y
return z }
// Example usage (doesn't compile)
let f x = …
Run Code Online (Sandbox Code Playgroud)