小编Car*_*iel的帖子

F#struct成员引用'this'会导致错误

新的F#开发人员,长期以来的C#开发人员.作为学习F#的练习,我正在通过Eric Lippert关于图形着色的系列工作,从C#转换为F#.我目前正在做第二部分.

最初的C#在博文中 - 这是迄今为止的F#翻译 - 但是它没有编译:

type BitSet = struct
        val bits : int
        private new(b) = { bits = b }

        static member Empty = BitSet(0)

        member this.Contains (item:int) = (this.bits &&& (1<<< item)) <> 0
        member this.Add (item:int) = BitSet(this.bits ||| (1 <<< item))
        member this.Remove (item:int) = BitSet(this.bits &&& ~~~(1<<<item))
        member this.Bits = seq {
                for item in 0..31 do
                    if this.Contains(item) then
                        yield item
            }
    end
Run Code Online (Sandbox Code Playgroud)

这会产生非常神秘的错误"错误FS0406:byref-typed变量'this'以无效方式使用.Byrefs不能被闭包捕获或传递给内部函数"来自Bits:seq <int>的定义.

奇怪的是,将关键字"struct"更改为"class"会产生有效的代码.从C#的角度来看,这似乎是胡说八道,但我确信它背后有一个合理的原因.现在的问题是-如何我写的位功能?为理解这一点,我需要理解的基本F#原则是什么?

f# struct class this seq

9
推荐指数
2
解决办法
311
查看次数

递归C#函数从for循环内部返回 - 如何转换为F#?

很长一段时间C#开发人员,学习F#.我选择了一个功能相当的C#代码,我将其作为一个学习练习 - 将其翻译为F#.我已经做了很多关于函数式编程的阅读,并定期使用C#中的函数结构,但我只有几个小时的学习F#.

此功能是解决类似于"LonPos 101"的难题的程序的一部分,您可以在亚马逊等上找到该解决方案.解算器中使用的策略基于识别拼图空间中只有30个有效位置,因此"迄今为止的解决方案"可以用一个整数表示,每个部分的每个有效位置也可以用一个整数表示,一个完整的解决方案是一个包含7个部分中每一个的可能位置的集合,其中"权重" "7件中加入溶液重量(2 ^ 30-1).在给定的函数中,"key"是该片段的"主键",wbk是"按键加权" - 按键索引,包含相应片段的有效位置列表,而"w"是上述"解决方案" -至今".返回值是从键到选定位置的映射,并且在导致解决方案的成功递归的出口路径上填充.我发现在开发C#解决方案时,使这个排序列表使解决方案查找器的速度提高了一个数量级,但它与普通列表同样有效.

这是我遇到问题的C#函数:

int solutionWeight;

Dictionary<int,int> Evaluate(int w, Dictionary<int, SortedSet<int>> wbk, int key)
{
  if (w == solutionWeight)
    return new Dictionary<int, int>();  

  if (key == 8)
    return null;

  foreach (var w2 in wbk[key])
  {
    if ((w & w2) != 0)
      continue;
    var s = Evaluate(w | w2, wbk, key + 1);
    if (s != null)
    {
      s.Add(key, w2);
      return s;
    }
  }

  return null;
}
Run Code Online (Sandbox Code Playgroud)

这是我对F#版本的尝试 - 它编译,但是它无法正常工作 - 当执行w不是solutionWeight并且key等于8的情况时,它最终在let ss …

c# f# loops return c#-to-f#

7
推荐指数
1
解决办法
645
查看次数

标签 统计

f# ×2

c# ×1

c#-to-f# ×1

class ×1

loops ×1

return ×1

seq ×1

struct ×1

this ×1