在单行中生成F#中的一系列点

dev*_*ium 5 .net f# functional-programming

我发现自己经常实现相同的(x, y)模式:

let rectangleSizes = seq {
    for w = 1 to width do
        for h = 1 to height do
            yield (w, h)
}
Run Code Online (Sandbox Code Playgroud)

不可能有一个简单的单行程,偶然吗?当然我只能在一行中编写这个相同的函数,但我觉得它的可读性会受到很大影响:

let rectangleSizes = seq { for w = 1 to width do for h = 1 to height do yield (w, h) }
Run Code Online (Sandbox Code Playgroud)

Gus*_*Gus 9

如果我一直有初始化我将定义自己的运算符:

let (..) (x0,y0) (xn,yn) =  
    seq {
        for x = x0 to xn do
            for y = y0 to yn do
                yield (x, y)}

let rectangleSizes = {(1,1) .. (5,7)}
Run Code Online (Sandbox Code Playgroud)

但这会影响原始(..)运算符,但您可以使用其他运算符名称或函数.还有一个技巧可以避免影响原始运算符定义.

或者,如果您使用实现像F#+这样的Applicative Functors的库,您可以在一行中将其定义为:

let rectangleSizes = (fun x y -> (x, y)) <!> {1..width} <*> {1..height}
Run Code Online (Sandbox Code Playgroud)

注意:fun x y -> (x, y)通常调用该函数tuple2

#r @"FsControl.Core.dll"
#r @"FSharpPlus.dll"

open FSharpPlus
let tuple2 a b = (a,b)
let width, height = 5,7

let rectangleSizes = tuple2 <!> {1..width} <*> {1..height}
Run Code Online (Sandbox Code Playgroud)