2017-10-15 77 views
2

简单的问题。F#为什么我会得到这种返回类型?

我有一个函数,它需要两个字符串和一个int,并返回一个新的字符串和n行,并在两个输入字符串之间交替。

let rec f s1 s2 n = function 
    | s1 when n > 0 -> s1 + "\n" + f s2 s1 (n-1) 
    | s2 when n > 0 -> s2 + "\n" + f s1 s2 (n-1) 

调用它

f "ab" "cd" 4 

应该返回ab\ncd\nab\ncd

目前,我得到一个错误,在我的方法,我不知道为什么。任何提示?

UPDATE:

事实证明,它是通过使用匿名function引起的。它改变到match表达解决它:

let rec f s1 s2 n = 
    match s1 with 
    | _ when n <= 0 -> "" 
    | s1 when n > 0 -> s1 + "\n" + f s2 s1 (n-1) 
    | s2 when n > 0 -> s2 + "\n" + f s1 s2 (n-1) 

更新2:上述功能可能是在正确方向迈出的一步,但下面的实施是通过TheQuickBrownFox指出正确的。

let rec f s1 s2 n = 
    if n <= 0 then "" 
    else s1 + "\n" + f s2 s1 (n-1) 
+0

我更新了你的更新后的答案。 – TheQuickBrownFox

回答

3

function关键字的一个参数就创建了一个新的匿名函数(或lambda),并直接进入模式匹配。

所以你的f功能需要s1,s2n,然后返回另一个函数作为值。这是一样写这:

let rec f s1 s2 n = 
    fun x -> 
     match x with 
     | s1 when n > 0 -> s1 + "\n" + f s2 s1 (n-1) 
     | s2 when n > 0 -> s2 + "\n" + f s1 s2 (n-1) 

这不是我清楚你的函数试图这样做,我不能建议你修复。我建议暂时远离function关键字。尝试以这种形式写这个功能,看看是否有帮助:

let rec f s1 s2 n = 
    match ... with 
    ... 

UPDATE:

在更新的实现,你没有实际使用模式的所有匹配。模式部分被有效地丢弃,并且when子句正在完成所有的工作。此外,由于要么n <= 0要么n > 0,因此不可能达到最后的分支。你的新功能可以写得更简单:

let rec f s1 s2 n = 
    if n <= 0 then "" 
    else s1 + "\n" + f s2 s1 (n-1) 
+0

每次有人发布F#问题时都会收到通知吗? :p – Khaine775

+1

是的。如果您将鼠标悬停在标签上,您可以通过电子邮件订阅该标签:) – TheQuickBrownFox

+0

我可以使用您关于省略函数关键字的建议来找到正确的解决方案。 – Khaine775

相关问题