小编Dzu*_*aru的帖子

F#计算表达式透明状态与Bind一起传递

我有以下代码尝试使用通常的MaybeBuilder从网络流中读取可能不完整的数据(例如图像数据):

let image = maybe {
    let pos = 2 //Initial position skips 2 bytes of packet ID
    let! width, pos = readStreamAsInt 2 pos
    let! height, pos = readStreamAsInt 2 pos
    let! data, pos = readStream (width*height) pos
    advanceInStream pos
    return {width = width; height = height; pixels = data}
}
Run Code Online (Sandbox Code Playgroud)

因此,如果数据尚未到达NetworkStream,则readStream [asInt] [numBytes] [offset]函数返回一些[data]或None.读取整个网络数据包时执行advanceInStream函数.

我想知道是否有一些方法可以编写一些自定义计算表达式构建器来隐藏来自其用户的pos,因为它始终是相同的 - 我读取了一些数据并在流中定位并将其作为最后一个参数传递给下一个读取函数.

PS MaybeBuilder使用:

type MaybeBuilder() =    
    member x.Bind(d,f) = Option.bind f d
    member x.Return d = Some d
    member x.ReturnFrom d = …
Run Code Online (Sandbox Code Playgroud)

f# computation-expression

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

F#与mutable匹配

刚刚开始玩F#,我想在我的应用程序中创建一些可变模型,使用F#discriminated union而不是类层次结构.然而似乎没有办法"低估"一个受歧视的联盟,"匹配"不会传播可变性.我该怎么办?

type Foo = {
    mutable x: int
}

type FooBar = 
    | Foo of Foo
    | Bar

let f = {x = 2};
do f.x <- 3; //All ok

let fb = Foo {x = 1}
do match fb with
    | Foo {x = x} -> x <- 2 //"This value is not mutable"
    | Bar -> ()
Run Code Online (Sandbox Code Playgroud)

f#

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

如何使用repmat将1d矢量重塑为3d矩阵?

我可以10x10x3用以下内容创建一个矩阵:

A(1:10,1:10,1) = 1/4;
A(1:10,1:10,2) = 1/2;
A(1:10,1:10,3) = 1/4;
Run Code Online (Sandbox Code Playgroud)

如何使用repmat[1/4 1/2 1/4]'给出的向量来完成?

matlab multidimensional-array

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