标签: computation-expression

构造复杂对象图的计算表达式

给出以下类型:

type Trip = {
  From: string
  To: string
}

type Passenger = {
   Name: string
   LastName: string
   Trips: Trip list
}
Run Code Online (Sandbox Code Playgroud)

我正在使用以下构建器:

type PassengerBuilder() = 
  member this.Yield(_) = Passenger.Empty

  [<CustomOperation("lastName")>]
  member __.LastName(r: Passenger, lastName: string) = 
    { r with LastName = lastName }

  [<CustomOperation("name")>]
  member __.Name(r: Passenger, name: string) = 
    { r with Name = name }

type TripBuilder() = 
  member __.Yield(_) = Trip.Empty

  [<CustomOperation("from")>]
  member __.From(t: Trip, f: string) = 
    { t with From = f }

  // …
Run Code Online (Sandbox Code Playgroud)

f# computation-expression

2
推荐指数
1
解决办法
96
查看次数

定义F#计算表达式时,Zero成员的目的是什么?

我正在尝试学习F#计算表达式.一般来说,零成员的目的是什么?

它对序列的定义是什么?

它对异步工作流程的定义是什么?

f# computation-expression

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

如何将前向管道表达式转换为计算表达式?

所以,我想构建一个自定义计算表达式,允许我转这个 -

testWorld |>
    subscribe ClickTestButtonAddress [] addBoxes |>
    addScreen testScreen TestScreenAddress |>
    setP (Some TestScreenAddress) World.optActiveScreenAddress |>
    addGroup testGroup TestGroupAddress |>
    addEntityGuiLabel (testLabelGuiEntity, testLabelGui, testLabel) TestLabelAddress |>
    addEntityGuiButton (testButtonGuiEntity, testButtonGui, testButton) TestButtonAddress |>
    addEntityActorBlock (testFloorActorEntity, testFloorActor, testFloor) TestFloorAddress |>
    (let hintRenderingPackageUse = HintRenderingPackageUse { FileName = "AssetGraph.xml"; PackageName = "Misc"; HRPU = () }
     fun world -> { world with RenderMessages = hintRenderingPackageUse :: world.RenderMessages }) |>
    (let hintAudioPackageUse = HintAudioPackageUse { FileName = "AssetGraph.xml"; PackageName = "Misc"; HAPU …
Run Code Online (Sandbox Code Playgroud)

monads f# computation-expression

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

如何在F#中正确地丢弃(monadic)计算的结果

在Haskell中,我可以写:

token: Parser a -> Parser a
token p = do space
             v <- p
             space  
             return v
Run Code Online (Sandbox Code Playgroud)

在F#中,我走到了这一步:

let token = compose {
        let! _ = space
        let! v = parser
        let! _ = space
        return v
    }
Run Code Online (Sandbox Code Playgroud)

换句话说,我必须引入这个未使用的let! _ =绑定来丢弃"空间"解析器(monad)的解析值,这是我不需要的.

如何在F#中避免这些无用的绑定?我尝试过使用do!,但是我收到一个错误(因为我的>>=函数不采用类型单位而是'a):

let (>>=) (p: Parser<'a>) (f: 'a -> Parser<'b>) : Parser<'b> 
Run Code Online (Sandbox Code Playgroud)

这是我的构建器定义:

type ParserComposer() = 
  member x.Bind(p, f) = p >>= f
  member x.Return(y) = ret y
  member x.Zero() = failure
Run Code Online (Sandbox Code Playgroud)

我需要定义>>功能吗?将Combine()添加到构建器?任何想法如何做到这一点?代码示例?

monads f# haskell computation-expression do-notation

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

如何使f#查询表达式可重用?

我试图习惯f#查询表达式.

首先,他们绝对渴望,因为:

let arr = [1; 2; 3]
let q = query { for item in arr do select item; count };;

val arr : int list = [1; 2; 3]
val q : int = 3
Run Code Online (Sandbox Code Playgroud)

我想重用该查询,所以我尝试延迟计算:

let arr = ref [1; 2; 3]
let q = lazy query { for item in !arr do select item; count }
q.Value;;

val arr : int list ref = {contents = [1; 2; 3];}
val q : Lazy<int> = 3
val …
Run Code Online (Sandbox Code Playgroud)

linq f# lazy-evaluation computation-expression

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

在其他工作流程/ monad中嵌入工作流程/ monad?

例如,我有一个日志记录工作流程,我想在日志记录工作流程中使用async.如何bind在异步工作流程中调用日志记录?

log {
    async {
       let! a = .... // Need to do logging here.
       let! b = .... // Need to do async here
Run Code Online (Sandbox Code Playgroud)

编辑:我听说在F#中使用工作流代替AOP以实现横切关注目的是个好主意.我不知道如何处理嵌入问题.或者使用工作流程不是一个好主意?

f# computation-expression

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

F#在携带状态时绑定到输出

我正在尝试使用计算表达式来构建操作列表。我需要绑定到从getFood操作返回的值,以便我可以注册稍后的步骤来使用它。

type Food =
    | Chicken
    | Rice

type Step =
    | GetFood of Food
    | Eat of Food
    | Sleep of duration:int

type Plan = Plan of Step list

type PlanBuilder () =

    member this.Bind (plan:Plan, f) =
        f plan
    member this.Yield _ = Plan []
    member this.Run (Plan x) = Plan (List.rev x)

    [<CustomOperation("eat")>]
    member this.Eat (Plan p, food) =
        printfn "Eat"
        Plan ((Eat food)::p)

    [<CustomOperation("sleep")>]
    member this.Sleep (Plan p, duration) =
        printfn "Sleep"
        Plan ((Sleep …
Run Code Online (Sandbox Code Playgroud)

monads f# computation-expression

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

如何在计算表达式中传递/设置 byref 参数?

此 F# 代码无法编译:

let DoubleString (str : string) = str + str

let ExampleSetString (str : string byref) = 
    async {
        str <- DoubleString str
        return 1
    }
Run Code Online (Sandbox Code Playgroud)

我收到以下错误消息str <- DoubleString str

byref 类型变量“str”的使用方式无效。Byref 不能被闭包捕获或传递给内部函数

我必须采用 byref 变量,将其传递到计算表达式中的一些纯函数中,然后设置此 byref 变量的值。我怎样才能做到这一点?

f# pass-by-reference computation-expression

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

在绑定中获取f的属性

我在工作流程中有一些代码,我想将属性赋予函数

表达是这样的

let! accounts = _accounts()
Run Code Online (Sandbox Code Playgroud)

在我的约束中,我有这个

member this.Bind(x,f) = 
    let attributes = 
      f.GetType()
       .GetCustomAttributes(typeof<myattribute>,false)
Run Code Online (Sandbox Code Playgroud)

我们的想法是获取函数_accounts()的属性.但是f代表countinuation而不是_accounts,所以无论如何我可以得到被调用函数的属性?

f# computation-expression

0
推荐指数
1
解决办法
66
查看次数