我正在使用kinect在F#中做一些事情,但是在使用深度数据时遇到了一些麻烦.我一直在关注本教程:http://digitalerr0r.wordpress.com/2011/06/21/kinect-fundamentals-3-getting-data-from-the-depth-sensor/
有c#例子,我一直试图转换为F#.
这部分代码存在问题:
void kinectSensor_DepthFrameReady(object sender, ImageFrameReadyEventArgs e)
{
PlanarImage p = e.ImageFrame.Image;
Color[] DepthColor = new Color[p.Height * p.Width];
float maxDist = 4000;
float minDist = 850;
float distOffset = maxDist – minDist;
kinectDepthVideo = new Texture2D(GraphicsDevice, p.Width, p.Height);
int index = 0;
for (int y = 0; y < p.Height; y++)
{
for (int x = 0; x < p.Width; x++, index += 2)
{
int n = (y * p.Width + x) * 2; …Run Code Online (Sandbox Code Playgroud) let h = dict [(1, 2), (3, 4)]
Console.WriteLine(h.Count)
for i in h do
Console.WriteLine(i)
Run Code Online (Sandbox Code Playgroud)
给我
1
[(1, 2), (3, 4)]
Run Code Online (Sandbox Code Playgroud)
两个问题.首先,为什么迭代dict会给我一个只有1个项目的序列,dict本身?这背后可能存在一些逻辑,这也会影响我最终试图迭代的其他事情.这对于由dict(Any(),All(),Aggregate()等公开的所有其他Seq成员意味着什么?)?
其次,是否有一种很好的方法来迭代并通常操纵字典中的键值对,就像在Python中一样?
如何将带有when条件的F#模式匹配转换为Scala?
我在F#中有以下代码:
match t0, t1 with
| "a", _ -> true
| b, "a" when not (b = "c") -> false
Run Code Online (Sandbox Code Playgroud)
关于这个主题的另一篇文章Scala:当两个项目中的一个满足某些条件时模式匹配,但我无法获得基线.
我正在编写一个有两个构造函数的泛型类:第一个初始化每个字段,第二个(无参数)不应该初始化任何字段.
我发现实现此目的的唯一方法是使用"空"参数调用主构造函数,即Guid.Empty和null.除了没有看到我未经训练的眼睛的良好功能风格,这意味着我必须对a' : null第二个参数设置约束,我不想要:
type Container<'a when 'a : null>(id : Guid, content : 'a) =
let mutable _id = id
let mutable _content = content
new() = Container<'a>(Guid.Empty, null)
member this.Id
with get() = _id
and set(value) = _id <- value
member this.Content
with get() = _content
and set(value) = _content <- value
Run Code Online (Sandbox Code Playgroud)
我看到两种解决方法:
defaultc#关键字而不是null(F#中存在这样的东西?)实现这个课程的最佳方法是什么?
如何在F#中检索元组的头部和尾部?
例如Conj (a, b),头部是Conj,尾部是(a, b).
我想buildtree在每个参数上递归运行函数,把头作为Node元素,F#中的映射在哪里?
let rec getparams = map List.head (List.tail getparams);
type Elem = Prop
type Tree = E | T of Elem * Tree * Tree
let rec buildtree vars = function
| E = head vars
| T = buildtree (getparams vars)
Run Code Online (Sandbox Code Playgroud)更新后:
open System
open Microsoft.FSharp.Reflection
// Learn more about F# at http://fsharp.net
//type Prop = {a: string; b: string}
//let Prop a b …Run Code Online (Sandbox Code Playgroud) type Tag(Kids) =
member this.Kids = Kids
static member (-) (this: Tag, that: list<obj>) =
Tag(that::this.Kids)
Run Code Online (Sandbox Code Playgroud)
此代码的要点是基于现有对象构造新对象,但修改对象上的一个(或多个)字段.基本上,它是thing.setX(...)mutator方法的代理,除了使用不可变数据.
它看起来非常丑陋和冗长,我确信在保持数据的不变性的同时必须有更好的方法,但我还没弄清楚如何.这有什么语法上很好的方法吗?
编辑:为了清楚起见,我还在层次结构中有其他类:
type HTMLTag(s, Classes, Kids, Styles) =
inherit Tag(Kids)
member this.NominalTag = s
member this.Classes = Classes
member this.Styles: list<String * String> = Styles
static member (-) (this: HTMLTag, that: list<obj>) =
HTMLTag(this.NominalTag, this.Classes, that::this.Kids, this.Styles)
Run Code Online (Sandbox Code Playgroud)
除了它非常冗长之外,-函数的"复制与修改"的东西完全是非泛型的:即使我每次都做同样的事情(复制w /修改为同一个变量)我还要重写整个事情,这不是很好.
我发现非常讨厌的一件事是变异非常简单:
static member (-) (this: Tag, that: list<obj>) =
this.Kids = that :: this.Kids
this
Run Code Online (Sandbox Code Playgroud)
但我试图尽可能保持一切不变
我试图在F#中使用一个名为正则表达式而没有太多运气.移植到C#,它的工作原理.我在这里缺少F#的特殊性还是一个bug?
F#
open System.Text.RegularExpressions;;
let regex = new Regex("(?<liveId>WindowsLiveID)|(?<facebook>Facebook)", RegexOptions.Compiled ||| RegexOptions.IgnoreCase);;
let m = regex.Matches("ImWindowsLiveIDOK");;
m.[0].Groups.["liveID"].Success;;
Run Code Online (Sandbox Code Playgroud)
C#
var regex = new Regex("(?<liveId>WindowsLiveID)|(?<facebook>Facebook)", RegexOptions.Compiled | RegexOptions.IgnoreCase);
var match = regex.Matches("ImWindowsLiveIDOK");
Console.WriteLine(match[0].Groups["liveId"].Success);
Run Code Online (Sandbox Code Playgroud) let dTuples = new Dictionary<int, string * string * int>()
dTuples.Add(1, ("A", "OK", 1))
dTuples.Add(2, ("B", "NOK", 2))
dTuples.Add(3, ("C", "OK", 3))
Run Code Online (Sandbox Code Playgroud)
我想在字典中找到它们在值部分的第二个元素中具有"OK"的项目.我还想将结果转换为元组数组而不使用字典的关键部分.对于上面的例子,我需要这个:
let tuplesOK = [| ("A", "OK", 1); ("C", "OK", 3) |]
Run Code Online (Sandbox Code Playgroud)
如果您提供代码,请同时添加一些解释,以便我更好地理解它!谢谢,约翰
我想实现一个函数,它将大小为n和列表作为输入.此函数会将列表切割为两个列表,一个是大小n,另一个是另一个列表.我是这门语言的新手,很难学习语法.
我遇到的主要问题是找到一种方法来表达列表的大小而不使用任何循环或可变变量.
任何人都可以给我一些指示吗?
所以我有一个带有属性名称的类型类型.
我正在创建一个类型名称列表,如下所示.
let genres = new Genre()
[ genres.Name <- "Disco";
genres.Name <- "Jazz";
genres.Name <- "Rock"; ] |>ignore
Run Code Online (Sandbox Code Playgroud)
想知道是否有更多的创造这种创造的方式?
f# ×10
collections ×1
dictionary ×1
f#-scripting ×1
immutability ×1
kinect ×1
list ×1
loops ×1
regex ×1
scala ×1
tuples ×1
xna ×1