2010-04-12 51 views
1

下面的代码:F#在Mac上:在内部函数语法错误

exception NoElements of string 

let nth(k, list) = 
    let rec loop count list = 
     match list with 
     | head :: _ when count = k -> head 
     | _ :: tail when count <> k -> loop (count+1) tail 
     | [] -> raise (NoElements("No Elements")) 
    loop 0 list 
;; 
printfn "%A" (nth(2, [1; 1; 2; 3; 5; 8])) 

可生产在Mac上编译时,下面的错误,而不是在Visual Studio 2010中:

nth.fs( 10,0):错误FS0191:语法错误。

nth.fs(4,4):错误FS0191:在'let'中找不到匹配的'in'。

回答

4

确保您使用的是轻量级语法指令在你的代码的顶部

#light 

(这是唯一老版本的编译器需要;抓住newer version。)

+0

但是,如果您使用的是最新版本的F#,则不应该需要'#light'(我不确定这是否适用于Mac,但我相信它应该 - 如果否,请将问题报告给_fsbugs(at)microsoft.com_)。使用最新版本是一个好主意,因为每个版本都有一些改进:-) – 2010-04-12 18:22:46

+0

是的,这个版本显然很旧 - 升级到RTM,今天刚刚宣布! http://blogs.msdn.com/dsyme/archive/2010/04/12/f-2-0-released-as-part-of-visual-studio-2010.aspx – Brian 2010-04-12 18:25:06

+0

恩,因为我有它的工作我的电脑以及VS.Net2010中,我会很懒惰...有没有办法迫使达尔文港获得比1.9.4.19更高的版本? – 2010-04-13 23:41:12

0

您需要缩进match一行。

还要注意列表元素应该用分号隔开;你有一个包含六元组的单元素列表。

这里有一个工作版本:

exception NoElements of string 

let nth(k, list) = 
    let rec loop count list = 
     match list with 
     | head :: _ when count = k -> head 
     | _ :: tail when count <> k -> loop (count+1) tail 
     | [] -> raise (NoElements("No Elements")) 
    loop 0 list 

printfn "%A" (nth(2, [1; 1; 2; 3; 5; 8])) 

是否有可能您的Mac有F#的一些更老的版本? fsc.exe报告什么版本? (如果它是非常非常老了,尝试添加“#light”作为第一行。)

+0

哎呀,它已经在我的代码中,但它传输不好。修正了我的例子。 – 2010-04-12 17:59:33