我试图在网络上找到一个例子。这是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
函数或->>
运算符没有任何内容。你知道什么是错的吗?
答案 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!
,这意味着返回给定序列的所有元素。