我有以下代码尝试使用通常的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#,我想在我的应用程序中创建一些可变模型,使用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) 我可以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]'给出的向量来完成?