1

我试图举一个我在网络上找到的例子。这是 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”。应为“->”或其他标记。

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

4

2 回答 2

1

尝试

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

自编写代码以来,该语言已经发生了很多变化。特别是,->>运算符已被替换为yield!Set.mem已重命名为更具描述性的Set.contains,并且推导式现在使用if ... then代替when

于 2011-04-04T13:31:05.550 回答
1

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

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

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

于 2011-04-04T14:15:13.167 回答