给出以下类型:
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#计算表达式.一般来说,零成员的目的是什么?
它对序列的定义是什么?
它对异步工作流程的定义是什么?
所以,我想构建一个自定义计算表达式,允许我转这个 -
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) 在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()添加到构建器?任何想法如何做到这一点?代码示例?
我试图习惯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) 例如,我有一个日志记录工作流程,我想在日志记录工作流程中使用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以实现横切关注目的是个好主意.我不知道如何处理嵌入问题.或者使用工作流程不是一个好主意?
我正在尝试使用计算表达式来构建操作列表。我需要绑定到从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) 此 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 变量的值。我怎样才能做到这一点?
我在工作流程中有一些代码,我想将属性赋予函数
表达是这样的
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,所以无论如何我可以得到被调用函数的属性?