F#Fractal - 一个我无法弄清楚的错误

时间:2011-04-04 13:25:45

标签: f# functional-programming fractals

我试图在网络上找到一个例子。这是F#中的3D分形。这是:http://tomasp.net/blog/infinite-cheese.aspx。源代码可在本文末尾下载。文章和样本是在2007年编写的,所以我认为代码只是略显过时。有一个代码块导致错误,代码将无法编译:

// Returns a cube with filtered sides
let private get_cube(incl_sides) =
    [ for (side,trigs) in cube
        when Set.mem side incl_sides
        ->> trigs ]

when关键字带有下划线,错误消息如下:

  

表达式中的意外关键字'when'。预期' - >'或其他令牌。

我无法弄清楚这有什么问题。为了更好地理解代码,我搜索了langauge规范。据我所知,Set.mem函数或->>运算符没有任何内容。你知道什么是错的吗?

2 个答案:

答案 0 :(得分:1)

尝试

[for (side, trigs) in cube do
    if Set.contains side incl_sides then
        yield! trigs]

自编写代码以来,语言经历了很多变化。特别是,->>运算符已替换为yield!Set.mem已重命名为更具描述性的Set.contains,而现在使用if ... then代替when {1}}。

答案 1 :(得分:1)

是的,从博客文章链接的源代码版本有点旧。您可以在CodePlex上的F# samples project中找到最新(更新)版本。我认为可能还有其他一些变化,因此最好从CodePlex获取版本。 (它包括FractalSimple.fs,它是更简单的版本,Fractal.fs也可以删除不可见的立方体边。

该项目包含标准的Visual Studio 2008/2010 .fsproj项目。博客上的原始版本是使用F#CTP(来自VS 2005时)编写的,它具有完全不同的Visual Studio集成并使用了过时的.fsharpp项目格式(在MSBUILD格式存在之前)。

when->>构造已被用作编写查询的轻量级语法,但现在已被弃用,以使语法内部的语法与语言的其余部分保持一致。正如kvb指出的那样,你可以使用普通if .. then,唯一的非标准事物是yield!,这意味着返回给定序列的所有元素