小编Oen*_*ria的帖子

使用Either monad时如何处理回滚("铁路导向编程")

我正在使用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)

f# haskell functional-programming

19
推荐指数
1
解决办法
590
查看次数

用let!内部匹配语句导致编译错误

使用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#

14
推荐指数
2
解决办法
1855
查看次数

如何在前缀表示法中使用F#exponentiation运算符(**)?

对于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)

有没有我可以使用的逃脱角色,或者这只是一种奇怪的语言怪癖?

f#

8
推荐指数
1
解决办法
326
查看次数

在显示模板中使用 DisplayFor

我创建了一个 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因为那样我就不会得到布尔值的复选框、日期的日历控件等。

有没有好的办法解决这个问题?

asp.net-mvc asp.net-mvc-3 asp.net-mvc-2

5
推荐指数
1
解决办法
1840
查看次数

可以使用websharper作为嵌入式JS替代品吗?

是否有可能使用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)

javascript f# websharper

5
推荐指数
1
解决办法
490
查看次数

等待akka.net actor {}表达式中的F#异步任务

是否可以在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# akka.net

5
推荐指数
1
解决办法
1000
查看次数

我可以重载操作数是函数的运算符吗?

是否可以在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)

f#

3
推荐指数
1
解决办法
95
查看次数